Pylint:使用属性装饰器的成员函数会导致“无成员”错误

时间:2018-09-25 16:30:33

标签: python pylint

我遇到了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)

Pintint版本:

>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 :(得分:0)

恐怕Pylint就在这里,但信息有点误导。

因此,您的C类具有一个名为ans的属性,并且ans的定义收到self作为参数;稍后您用C调用C.ans类本身,但是在该类的上下文中,应该将Python作为self的{​​{1}}参数传递给什么?

所以问题是ans不在类的上下文中设置,因此您只能从self的实例访问属性,而不能从C类本身访问属性。

答案 1 :(得分:0)

所有的注释和答案确实有意义,因为实例方法只能在对象上调用,而不能在类上调用。但是,由于方法“ ans”使用的是@property装饰器,因此在类上调用“ ans”将返回属性对象。 所以,做

print(C.ans)

打印

<property object at 0x000001A819E55CC8>

c = C()
print(c.ans)

打印

42

因此您的代码是正确的。也许不是理想的Pythonic。但是,我已经测试了您的代码,并且运行正常。

enter image description here

是的,可能是Pylint的问题。我对Pylint的了解不多。所以不能在这里帮助您:(