Pylint: использование функции-члена декоратора свойств приводит к ошибке «no-member» - PullRequest
0 голосов
/ 25 сентября 2018

Я столкнулся со следующей проблемой с Pylint:

Учитывая следующий минимальный пример:

#tpack/__init__.py
class C:
    @property
    def ans(self):
        return 42

def f(c):
    return C.ans.fget(c)

Pylint выдает следующую ошибку:

>pylint -d missing-docstring -d invalid-name -d too-few-public-methods tpack
************* Module tpack
tpack\__init__.py:7:11: E1101: Method 'ans' has no 'fget' member (no-member)

------------------------------------------------------------------
Your code has been rated at 0.00/10 (previous run: 0.00/10, +0.00)

Версия Pylint:

>pylint --version
pylint 2.1.1
astroid 2.0.4
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]

Это известная проблема с Pylint?

Редактировать:

Кажется, существует некоторая путаница в использовании этого фрагмента кода.

Вот пример:

>python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from tpack import *
>>> c = C()
>>> f(c)
42

При доступе к свойству через класс получается фактический объект свойства, созданный декоратором.Благодаря этому можно получить доступ к функциям-членам объекта свойства.fgets является получателем.Нужно просто передать ему объект типа C, и свойство будет возвращено.

Ответы [ 2 ]

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

Что ж, все комментарии и ответы имеют смысл в том факте, что методы экземпляра должны вызываться только для объектов, а не для классов.Но здесь, поскольку метод ans использует декоратор @property, вызов ans в классе возвращает объект свойства.Таким образом,

print(C.ans)

печатает

<property object at 0x000001A819E55CC8>

и

c = C()
print(c.ans)

печатает

42

Итак, ваш код правильный.Может быть, не Pythonic в идеале.Но я проверил ваш код, и он прекрасно работает.

enter image description here

Так что, да, это, вероятно, проблема с Pylint.У меня нет особого понимания Пилинта.Так что не могу вам помочь: (

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

Боюсь, Пилинт прямо здесь, но сообщение немного вводит в заблуждение.

Таким образом, ваш класс C имеет свойство с именем ans, а определение ans получает self в качестве аргумента;позже вы вызываете сам класс C с C.ans, но в контексте класса Python должен передавать в качестве аргумента self ans?

Так что проблема в том, что self не установлен в контексте класса, поэтому вы можете получить доступ к свойствам только из экземпляра C, но не из самого класса C.

...