2013-04-26 9 views
9

Python3'te, functools.total_ordering decorator, 6 karşılaştırma operatörünün tümünü almak için yalnızca __lt__ ve __eq__ yüklenmesine izin verir.python total_ordering: __le__ yerine __lt__ ve __eq__ neden?

I do not get tek tek, yani __le__ veya __ge__, yeterli olacaktır, iki operatörler yazmak zorundadır ve tüm diğerleri buna göre tanımlanabilir neden:

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

mi xor operatör yok sırf doğal olarak var mıdır?

+2

'xor' yerel olarak var. –

+0

@MartijnPieters sadece bit xor, değil mi? –

cevap

13

dokümantasyon __lt__() birini __le__(), __gt__() veya __ge__(), tanımlamalıdır ama sadece bir __eq__() yöntemi tedarik etmelidir belirtiyor.

Başka bir deyişle, __eq__ yöntemi isteğe bağlı'dır.

total_ordering implementation, __eq__ yöntemini belirtmenizi gerektirmez; Yalnızca __lt__(), __le__(), __gt__() veya __ge__() yöntemleri için test eder. Bunlardan biri olan 3'e kadar özel yöntem eksiktir.

__eq__ yöntemi, temel object nesnesi sizin için bir tane tanımlar; iki örnek, sadece aynı nesne ise eşit kabul edilir; ob1 == ob2 yalnızca ob1 is ob2True ise. do_richcompare() function in object.c; Koddaki == operatörünün işaretçileri karşılaştırdığını unutmayın.

+0

Sanırım bunun sebebi, eşitliğin çok yoğun bir şekilde kullanılma eğiliminde olması, bunu manuel olarak uygulamak anlamlıdır. –

İlgili konular