Incoerente applicazione degli collections.abc

voti
1

Sto cercando di capire collections.abcil codice sorgente.

Diamo uno sguardo su Hashabledi classe __subclasshook__implementazione:

@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

Qui abbiamo prima di tutto controllare che non v'è di proprietà hashe di verificare che esso ha non valore falso. Questa logica è presentato anche in Awaitableclasse.

E AsyncIterabledi classe __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

Qui dobbiamo solo controllare che non v'è __aiter___proprietà, e questa logica è presentato in tutte le altre classi di questo pacchetto.

C'è qualche motivo di questa differenza logica?

È pubblicato 09/07/2016 alle 13:10
dall'utente
In altre lingue...                            


1 risposte

voti
3

Il __hash__protocollo consente esplicitamente segnalazione una classe come nel calcolo dell'hash impostando __hash__ = None.

Se una classe [...] vuole sopprimere il supporto hash, esso dovrebbe includere __hash__ = Nonenella definizione della classe.

La ragione è che a == brichiede sempre hash(a) == hash(b). In caso contrario, dict, sete le strutture di dati simili si rompono. Se una classe bambino cambia __eq__in modo esplicito o in altro modo, questo potrebbe non essere vero. Così, __hash__può essere contrassegnati come non applicabile.

Risposto il 09/07/2016 a 14:12
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more