如何让 PyC​​harm 识别自定义属性装饰器?

Posted

技术标签:

【中文标题】如何让 PyC​​harm 识别自定义属性装饰器?【英文标题】:How can I get PyCharm to recognize a custom property decorator? 【发布时间】:2019-03-20 21:24:44 【问题描述】:

让我们考虑以下示例类:

class Foo:
    def __init__(self):
        self._bar = None

    @property
    def bar(self):
        if self._bar is None:
            self._bar = ...  # a long computation
        return self._bar

我创建了一个cachedproperty 装饰器来隐式处理将计算结果存储为类实例的成员。这是此类装饰器类的简化示例:

class cachedproperty(property):
    def __init__(self, fget):
        @functools.wraps(fget)
        def cfget(obj):
            name = '_' + fget.__name__
            if not hasattr(obj, name):
                setattr(obj, name, fget(obj))
            return getattr(obj, name)
        super().__init__(cfget)

现在Foo 类看起来像这样:

class Foo:
    @cachedproperty
    def bar(self):
        return ...  # a long computation

尽管它有效,但 PyCharm 现在无法将bar 视为Foo 的属性,而是将其视为一种方法,这有点不方便。例如,可以在自动完成下拉菜单中看到这一点:

我的问题是:如何强制 PyCharm 将我的自定义属性装饰器视为实际属性?

【问题讨论】:

【参考方案1】:

看起来 PyCharm 完全根据装饰器的名称做出这个决定。例如,将您的 cachedproperty 装饰器重命名为 cached_property(使其与该名称的 Django's decorator 匹配)有效:

...而使用具有不同名称的内置 property 装饰器不会:

【讨论】:

这很不幸,因为我的代码中有几个自定义的“属性”装饰器,我希望能够为 PyCharm 相应地“标记”它们

以上是关于如何让 PyC​​harm 识别自定义属性装饰器?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 PyC​​harm 显示来自 pytest 的整个错误差异?

如何让 PyC​​harm 从我的本地包存储库更新?

如何让 sphinx 识别装饰的 python 函数

Django 自定义装饰器 - 函数没有属性 get

你如何使用 Flask-Login 和自定义 Python 装饰器来分配用户权限?

iOS 自定义选择器ActionSheet