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

问题描述 投票:0回答:2

我在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类型的对象传递给它,然后返回该属性。

python pylint
2个回答
0
投票

那么所有的注释和答案都有意义,因为实例方法只应该在对象上而不是在类上调用。但是,由于方法'ans'正在使用@property装饰器,因此在类上调用'ans'会返回一个属性对象。所以,做

print(C.ans)

版画

<property object at 0x000001A819E55CC8>

c = C()
print(c.ans)

版画

42

所以你的代码是正确的。理想情况下,也许不是Pythonic。但是,我已经测试了你的代码,它运行得很好。

enter image description here

所以,是的,它可能与Pylint有关。我对Pylint没有多少见解。所以无法帮助你:(


0
投票

我担心Pylint就在这里,但这个消息有点误导。

所以你的C类有一个名为ans的属性,而ans定义接受self作为参数;之后你用C调用C.ans类本身但是在类的上下文中,Python应该作为selfans参数传递给什么?

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

© www.soinside.com 2019 - 2024. All rights reserved.