2016-07-09 4 views
1

collections.abc 소스 코드를 이해하려고합니다. collections.abc의 일관성없는 구현

는 이제 __subclasshook__ 구현 ' 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 

여기에 우리가 먼저의 재산 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