Python collections.abc的实现不一致
我正在努力理解源代码 让我们看一看Hashable类的实现:Python collections.abc的实现不一致,python,python-3.x,abc,Python,Python 3.x,Abc,我正在努力理解源代码 让我们看一看Hashable类的实现: @classmethod def __subclasshook__(cls, C): if cls is Hashable: for B in C.__mro__: if "__hash__" in B.__dict__: if B.__dict__["__hash__"]: return True
@classmethod
def __subclasshook__(cls, C):
if cls is Hashable:
for B in C.__mro__:
if "__hash__" in B.__dict__:
if B.__dict__["__hash__"]:
return True
break
return NotImplemented
在这里,我们首先检查是否存在属性哈希
,然后检查它是否具有非false值。此逻辑也在等待
类中提供
和AsyncIterable
class'\uuu子类hook\uuuu
:
@classmethod
def __subclasshook__(cls, C):
if cls is AsyncIterable:
if any("__aiter__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented
在这里,我们只需检查是否存在\uuuuu aiter\uuuuuu
属性,并且该逻辑在该包中的任何其他类中显示
这种逻辑差异有什么原因吗?通过设置\uuuuu hash\uuuu=None
,显式允许将类标记为不可损坏
如果类[…]希望取消哈希支持,则应在类定义中包含\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu=None
原因是
a==b
总是需要hash(a)==hash(b)
。否则,dict
、set
和类似的数据结构将中断。如果子类显式地或以其他方式更改\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuueq
,则此。因此,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。提到“可等待的”
并不总能正常工作,因此ABC可能无法最终确定。严格地说,没有任何东西禁止其他ABC以任何方式检查Hashable
。