Ich versuche, collections.abc
Quellcode zu verstehen.Inkonsistente Implementierung von collections.abc
Lassen Sie uns auf Hashable
Klasse __subclasshook__
Implementierung einen Blick:
@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
Hier wir zunächst prüfen, ob es Eigentum ist hash
und als überprüfen, ob es nicht falsch Wert hat. Diese Logik wird auch in der Klasse Awaitable
dargestellt.
Und AsyncIterable
Klasse __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
Hier stellen wir nur prüfen, ob es __aiter___
Eigenschaft ist, und diese Logik wird in allen anderen Klassen aus diesem Paket präsentiert.
Gibt es einen Grund für diesen logischen Unterschied?
Dies erklärt jedoch nicht, warum auch 'Awaitable' das tut. – Bakuriu
@Bakuriu Ich würde spekulieren, dass es vom Kopieren-Einfügen ist, sehen Sie, wie "Awaitable" direkt nach "Hashable" definiert wird. Die [docs] (https://docs.python.org/3.5/library/collections.abc.html#collections.abc.Awitable) erwähnen, dass 'Awaitable' nicht immer ordnungsgemäß funktioniert, sodass das ABC möglicherweise nicht finalisiert wird . Streng genommen verbietet nichts anderen ABCs die Überprüfung von 'Hashable' sowieso. – MisterMiyagi