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

Zoh*_*eir 7 python properties pycharm python-3.x python-decorators

让我们考虑以下示例类:

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
Run Code Online (Sandbox Code Playgroud)

我创建了一个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)
Run Code Online (Sandbox Code Playgroud)

现在类Foo看起来像这样:

class Foo:
    @cachedproperty
    def bar(self):
        return ...  # a long computation
Run Code Online (Sandbox Code Playgroud)

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

使用 @property 装饰器自动完成 Foo.bar

使用 @cachedproperty 装饰器自动完成 Foo.bar

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

Zer*_*eus 4

看来 PyCharm 纯粹根据装饰器的名称做出此决定。例如,将你的cachedproperty装饰器重命名为cached_property(以便它与Django 的该名称的装饰器相匹配)可以工作:

\n\n

带有属性标记的 Pycharm 下拉菜单

\n\n

\xe2\x80\xa6 而使用具有不同名称的内置property装饰器则不会:

\n\n

带有属性标记的 Pycharm 下拉菜单

\n

  • 这是非常不幸的,因为我的代码中有几个自定义的“属性”装饰器,我希望能够为 PyCharm 相应地“标记”它们 (2认同)