如何处理 pycharm 方法中的警告"Access to protected member"?



我有一些类

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

最新更新