Python collections.abc的实现不一致

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

我正在努力理解源代码

让我们看一看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
                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