2016-07-09 15 views
1

私は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___財産であり、このロジックは、このパッケージから、他のクラスで提示されていることを確認してください。

この論理的な違いは何かありますか?

答えて

3

__hash__ protocolは、明示的に、__hash__ = Noneを設定することによって、クラスにフラグを立てることができます。

クラス[...]がハッシュサポートを抑制したい場合は、クラス定義に__hash__ = Noneを含める必要があります。

理由はa == bは常にhash(a) == hash(b)を必要とすることです。それ以外の場合は、dict,setなどのデータ構造が破損します。子クラスが__eq__を明示的に変更する場合、これはもはや真実ではない可能性があります。したがって、__hash__には、該当しないとフラグを付けることができます。

+2

これは、なぜ「Awaitable」がこれを行うのかを説明するものではありません。 – Bakuriu

+0

@Bakuriu私はコピー貼りから、 'Hashable'の直後に' Awaitable'がどのように定義されているのかを見ています。 [docs](https://docs.python.org/3.5/library/collections.abc.html#collections.abc.Awaitable)には、「Awaitable」が常に正しく機能するとは限らないため、ABCがファイナライズされていない可能性があります。厳密に言えば、他のABCが「ハッシャブル」のチェックをとにかく禁止するものは何もありません。 – MisterMiyagi

関連する問題