Как я могу заставить PyCharm распознавать собственный декоратор свойств? - PullRequest
0 голосов
/ 16 октября 2018

Давайте рассмотрим следующий пример класса:

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

Myвопрос в том, как заставить PyCharm обрабатывать мой пользовательский декоратор свойств как фактическое свойство?

1 Ответ

0 голосов
/ 20 октября 2018

Похоже, что PyCharm принимает это решение исключительно на основании имени декоратора.Например, переименование вашего cachedproperty декоратора в cached_property (чтобы оно соответствовало декоратору Джанго с таким именем) работает:

Pycharm dropdown with property marker

… тогда как при использовании встроенного декоратора property с другим именем это не так:

Pycharm dropdown with property marker

...