我使用此逻辑来维护Object
实例的定向树:
class Object:
def __init__(self, *parents: 'Object'):
self.__parents = list(parents)
@property
def __ascendants(self):
for parent in self.__parents:
yield from parent.__ascendants
yield parent
这段代码运行良好,但PyLint抱怨__ascendants
是parent
的受保护成员,对PyLint来说,这是一个客户机类。在
对于一个受保护的、未损坏的成员,这是很好的:我不应该访问这样的成员,因为它们可能被Object
子类覆盖。在
但是在这种情况下,由于属性被损坏,子类不可能覆盖它们,这就是为什么我允许自己甚至在外部对象(提供给构造函数)上使用它们。在
TLDR;我正在寻找一种方法,使PyLint接受访问客户机子类的损坏属性,而不必每次都求助于#pylint: disable=protected-access
,或者全局禁用警告。在
看起来我可以使用astng
回调来注册一个MANAGER
,并转换一个模块,以便PyLint可以使用其他信息。但是,我只能添加存根成员(这样动态添加的成员就可以在没有警告的情况下使用),而且我不确定是否可以用这种方式解决问题。在
我还试图添加assert isinstance(parent, Object)
,但这没用。在
编辑:
我能够编写代码,这样PyLInt就不会引发protected-access
,而只会引发bad-staticmethod-argument
。我不在这个特定的类中使用其他staticmethod,所以这可能是这个问题的一个可接受的答案:
编辑2:(灵感来自@shx2)
使用具有正确参数名称的lambda也会愚弄Pylint:
class Object:
def __init__(self, *parents: 'Object'):
self.__parents = list(parents)
@property
def __ascendants(self):
get_ascendants = lambda self: self.__ascendants
for parent in self.__parents:
yield from get_ascendants(parent)
yield parent
编辑3:由于名称不会从生成器表达式(或列表综合)中泄漏,因此也可以这样写:
from itertools import chain
class Object:
def __init__(self, *parents: 'Object'):
self.__parents = list(parents)
@property
def __ascendants(self):
return chain(*(
chain(self.__ascendants, (self, ))
for self in self.__parents
))
为什么要使
ascendants
方法成为损坏的属性?如果您真的想使用这样一个复杂的继承并为每个超类保留多个parents
属性,那么对parents
进行损坏就可以了。{1>似乎不属于这个类,因为它不属于这个类:有办法愚弄皮林。在
一种方法是将
parent
伪装成self
:另一种方法是使用
^{pr2}$getattr
间接访问属性。而不是:执行:
相关问题 更多 >
编程相关推荐