gpt4 book ai didi

python - collections.abc 的实现不一致

转载 作者:行者123 更新时间:2023-11-30 22:53:11 25 4
gpt4 key购买 nike

我试图理解collections.abc源代码。

让我们看一下 Hashable 类的 __subclasshook__ 实现:

@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

在这里,我们首先检查是否存在属性hash,然后检查它是否具有非假值。此逻辑也出现在 Awaitable 类中。

AsyncIterable类'__subclasshook__:

@classmethod
def __subclasshook__(cls, C):
if cls is AsyncIterable:
if any("__aiter__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented

这里我们只是检查是否有 __aiter___ 属性,并且此逻辑存在于该包中的任何其他类中。

这种逻辑差异有什么原因吗?

最佳答案

__hash__ protocol通过设置 __hash__ = None 显式允许将类标记为不可散列.

If a class [...] wishes to suppress hash support, it should include __hash__ = None in the class definition.

原因是a == b总是需要hash(a) == hash(b) 。否则,dict , set和类似的数据结构崩溃。如果子类发生变化__eq__明确或以其他方式,这可能不再成立。因此,__hash__可以标记为不适用。

关于python - collections.abc 的实现不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38282684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com