Пилинт: Как определить самостоятельно определяемый декоратор свойств с классами свойств? - PullRequest
0 голосов
/ 03 июля 2018

Pylint сообщает об ошибке E0202 (скрытый методом) для кода Python, который использует определитель свойств, определенный пользователем. Мои попытки использовать опцию property-classes потерпели неудачу.

Вот props.py

from functools import wraps

def myproperty(func):
    @wraps(func)
    def fget(self):
        return func(self)
    return property(fget)

и testimport.py:

#!/usr/bin/python

from props import myproperty

class E0202(object):

    def __init__(self):
        self._attr = 'attr'
        self._myattr = 'myattr'

    @property
    def attr(self):
        return self._attr

    @attr.setter
    def attr(self, value):
        self._attr = value

    @myproperty
    def myattr(self):
        return self._myattr

    @myattr.setter
    def myattr(self, value):
        self._myattr = value

    def assign_values(self):
        self.attr = 'value'
        self.myattr = 'myvalue'

if __name__ == '__main__':
    o = E0202()
    print(o.attr, o.myattr)
    o.assign_values()
    print(o.attr, o.myattr)

Выполнение кода на Python 2.7.13 дает ожидаемые результаты:

$ python test.py
('attr', 'myattr')
('value', 'myvalue')

Pylint 1.6.5 сообщает об ошибке для самоопределяемого свойства, но не для обычного свойства:

$ pylint -E --property-classes=props.myproperty testimport.py 
No config file found, using default configuration
************* Module testimport
E: 20, 4: An attribute defined in testimport line 29 hides this method (method-hidden)

Строка 29 - это использование метода определения самоопределяемого свойства:

        self.myattr = 'myvalue'

Каковы были бы правильные параметры для pylint? Или это ложное срабатывание?

1 Ответ

0 голосов
/ 14 сентября 2018

Не уверен, что у меня возникла та же проблема, что и у вас, поскольку я получал ошибку no-member.

Используемый мной декоратор называется @memoized_property, и я смог решить эту проблему, добавив его в свой pylintrc:

init-hook="import astroid.bases; astroid.bases.POSSIBLE_PROPERTIES.add('memoized_property')"

(вы также можете передать его как аргумент pylint: --init-hook="import astroid.bases; astroid.bases.POSSIBLE_PROPERTIES.add('memoized_property') ")

...