我有一些类
class A(object):
def __init__(self, data):
self._data = data
def _equals(self, other):
return self._data == other._data
Pycharm不喜欢我访问other._data
因为它是私有的。
"访问受保护成员">
这对我来说没有意义,因为访问是从类内部进行的。
如何在没有警告的情况下在此处编写正确的代码?
如果你真的需要它,比如 namedlist 的._asdict()
,答案是我可以让 PyCharm 在一行上抑制特定的警告吗?
class A(object):
def __init__(self, data):
self._data = data
def _equals(self, other):
# noinspection PyProtectedMember
return self._data == other._data
Python 3.5+ 答案(引入了类型提示):
from __future__ import annotations
class A(object):
def __init__(self, data):
self._data = data
def _equals(self, other: A):
return self._data == other._data
按照 @Giacomo Alzetta 的建议使用类型提示,并允许使用from __future__ import annotations
键入提示类本身。
无需再破解PyCharm或撰写丑陋的评论。
正如@jonrsharpe所指出的,python 2 也支持通过 docstrings.
的类型提示,因为我支持 Python 2 失去支持。
OP问题中的评论对警告,适当的修复和最佳实践有很多深刻的见解,不幸的是,当前的答案没有提到大多数。所以它在这里:
关于警告本身,OP说:
这对我来说没有意义,因为访问是从类内部进行的。
不,不是。other
可以是任何类,不一定是A
。因此,即使您只将A
实例作为other
传递,代码中也没有任何内容指示或强制执行这一点。
指示可以通过类型提示来完成,正如 Gulzar 的答案所解释的那样。
有一些方法可以强制执行这一点:
- 强制
other
的类型A
(或子类):if not isinstance(other, A): return False
。这可以说是首选方式,但它确实击败了Python的鸭子类型。 - 如果您使用的是预定义的"丰富比较"特殊方法之一,例如
__eq__()
、__lt__()
、__gt__()
,而不是常规方法,_equals()
则可以返回一个特殊值,以便有机会使用other
的类反射方法来处理调用:if not isinstance(other, A): return NotImplemented
- 如果要保留鸭子类型以允许未知类,并且不使用私有属性(如
_data
)(否则仍会收到警告),则可以使用try
-block 来处理缺少的属性:
try:
return self.data == other.data
except AttributeError: # other has no .data
return False