2013-04-26 2 views
9

In Python3, lo functools.total_ordering decorator consente di sovraccaricare solo __lt__ e __eq__ per ottenere tutti e 6 gli operatori di confronto.python total_ordering: perché __lt__ e __eq__ invece di __le__?

Non capisco il motivo per cui si deve scrivere due operatori quando uno sarebbe sufficiente, vale a dire __le__ o __ge__, e tutti gli altri sarebbe definito di conseguenza:

a < b <=> not (b <= a) 
a > b <=> not (a <= b) 
a == b <=> (a <= b) and (b <= a) 
a != b <=> (a <= b) xor (b <= a) 

è che solo perché operatore XOR non lo fa esiste in modo nativo?

+2

'xor' esiste in modo nativo. –

+0

@MartijnPieters solo bit per bit xor, non è vero? –

risposta

13

La documentazione si necessario definire uno dei __lt__(), __le__(), __gt__() o __ge__(), ma solo necessario fornire un metodo __eq__().

In altre parole, il metodo __eq__ è opzionale.

Lo total_ordering implementation non richiede di specificare un metodo __eq__; verifica solo i metodi __lt__(), __le__(), __gt__() o __ge__(). Fornisce fino a 3 metodi speciali mancanti basati su uno di questi 4.

Il metodo __eq__ è facoltativo perché l'oggetto base object ne definisce uno per te; due istanze sono considerate uguali solo se sono lo stesso oggetto; ob1 == ob2 solo se ob1 is ob2 è True. Vedi lo do_richcompare() function in object.c; ricorda che l'operatore == nel codice ci sta confrontando i puntatori.

+0

Immagino che sia perché l'uguaglianza tende ad essere così pesantemente utilizzata, ha senso implementarla manualmente. –