如何让PyCharm识别自定义装饰器?

时间:2018-10-16 10:56:06

标签: python python-3.x properties pycharm 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

我创建了一个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的属性,而将其视为方法却有些不便。例如,可以在自动完成下拉列表中看到这一点:

Autocompletion for Foo.bar with @property decorator

Autocompletion for Foo.bar with @cachedproperty decorator

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

1 个答案:

答案 0 :(得分:1)

PyCharm似乎完全基于装饰者的名字做出此决定。例如,将您的cachedproperty装饰器重命名为cached_property(以使其与该名称的Django's decorator匹配)有效:

Pycharm dropdown with property marker

…而使用内置property装饰器使用不同的名称则不会:

Pycharm dropdown with property marker