2013-04-26 7 views
9

W Python3 The functools.total_ordering decorator pozwala na tylko przeciążenie __lt__ i __eq__ uzyskać wszystkie 6 operatorów porównania.python total_ordering: dlaczego __lt__ i __eq__ zamiast __le__?

ja nie rozumiem, dlaczego trzeba pisać dwóch operatorów, gdy jeden będzie mało, a mianowicie __le__ lub __ge__, a wszyscy inni będą odpowiednio zdefiniowane:

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

Czy tylko dlatego, że operator nie xor istnieje natywnie?

+2

'xor' istnieje natywnie. –

+0

@MartijnPieters tylko bitowe xor, czyż nie? –

Odpowiedz

13

Dokumentacja stwierdza pan musi zdefiniować jedną __lt__(), __le__(), __gt__() lub __ge__(), ale tylko powinny dostarczyć metodę __eq__().

Innymi słowy, metoda __eq__ to opcjonalnie.

Opcja total_ordering implementation nie wymaga określenia metody __eq__; to sprawdza tylko dla __lt__(), __le__(), __gt__() lub __ge__() metod. Dostarcza do 3 brakujących metod specjalnych opartych na jednym z tych 4.

Metoda jest opcjonalna, ponieważ obiekt bazowy object definiuje je dla ciebie; dwa wystąpienia są uważane za równe tylko wtedy, gdy są tym samym obiektem; ob1 == ob2 tylko jeśli ob1 is ob2 jest . Zobacz do_richcompare() function in object.c; pamiętaj, że operator == w kodzie tam jest porównywanie wskaźników.

+0

Wyobrażam sobie, że to dlatego, że równość jest tak często używana, sensowne jest zaimplementowanie jej ręcznie. –