私はcollections.abc
ソースコードを理解しようとしています。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___
財産であり、このロジックは、このパッケージから、他のクラスで提示されていることを確認してください。
この論理的な違いは何かありますか?
これは、なぜ「Awaitable」がこれを行うのかを説明するものではありません。 – Bakuriu
@Bakuriu私はコピー貼りから、 'Hashable'の直後に' Awaitable'がどのように定義されているのかを見ています。 [docs](https://docs.python.org/3.5/library/collections.abc.html#collections.abc.Awaitable)には、「Awaitable」が常に正しく機能するとは限らないため、ABCがファイナライズされていない可能性があります。厳密に言えば、他のABCが「ハッシャブル」のチェックをとにかく禁止するものは何もありません。 – MisterMiyagi