Pylint 警告对对象的 protected 成员的可疑访问。它知道如何在访问来自对象本身时不发出警告,但不知道如何在访问来自对象的属性时不发出警告。
例如
class C(object):
def __init__(self):
C.__a = 0
a = property(lambda self: self.__a)
Pylint 告诉“W0212
( protected 访问):访问 protected 成员__a
客户类的”
我不想全局禁用 W0212
对于每个这样的属性定义,我不满意在本地 (*) 反复禁用它。
是否有解决此问题的已知方法?
(*)如:
class C(object):
def __init__(self):
C.__a = 0
a = property(lambda self: self.__a) # pylint: disable=W0212
边注
作为一个有趣的旁注,我选择的答案为实际的 Pylint 带来了额外的好处(在未来的版本中可能会改变,我不知道):它保留了 Pylint 检查不存在成员的能力,因为这个测试显示:
class C1(object):
member = 0
class C2(object):
def __init__(self):
self.__a = C1()
def a(self):
return self.__a
@property
def b(self):
return self.__a
c = property(lambda self: self.__a)
def test_member():
o = C2()
print(o.a().member)
print(o.b.member)
print(o.c.member)
def test_nonexistent():
o = C2()
print(o.a().nonexistent)
print(o.b.nonexistent)
print(o.c.nonexistent)
您将收到 print(o.a().nonexistent)
的警告和 print(o.b.nonexistent)
但不适用于 print(o.c.nonexistent)
.
最佳答案
在我看来,您可以使用装饰器,而 linter 可能不会提示:
class C(object):
def __init__(self):
self.__a = 0
@property
def a(self):
return self.__a
# You can use the decorator to create setters too...
@a.setter
def a(self, value):
self.__a = value
因为 linter 可以很容易地将 a
识别为类中的方法。否则,您几乎只能使用列出的选项。您可以全局或本地禁用警告,也可以根本不禁用警告——据我所知,无法仅在特定上下文中禁用警告。
关于python - 具有访问 protected 成员 : how to avoid? 的属性的 Pylint 警告 `W0212`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24833362/