__lt__ invece di __cmp__

| | | | | | | | | | | | | | | | |

Python 2.x ha due modi per sovraccaricare gli operatori di confronto, __cmp__ o gli "operatori di confronto avanzato" come __lt__. Si dice che i rich overload di confronto siano preferiti, ma perché è così?

Gli operatori di confronto avanzato sono più semplici da implementare ciascuno, ma è necessario implementarne molti con una logica quasi identica . Tuttavia, se puoi usare il cmp integrato e l'ordinamento delle tuple, allora __cmp__ diventa abbastanza semplice e soddisfa tutti i confronti:

classe A (oggetto): def __init__(self, name, age, other): self.name = name self.age = age self.other = other def __cmp__(self, other): assert isinstance(other, A) # presupposto per questo esempio return cmp((self.name, self.age, self.other), (other.name, other.age, other.other)) 

Questa semplicità sembra soddisfare le mie esigenze molto meglio che sovraccaricare tutti e 6 (!) dei ricchi confronti. (Tuttavia, puoi ridurlo a "solo" 4 se fai affidamento sull'"argomento scambiato"/comportamento riflesso, ma ciò si traduce in un netto aumento delle complicazioni, a mio modesto parere.)

< strong>Ci sono delle insidie impreviste di cui devo essere informato se solo sovraccarico __cmp__?

Comprendo il < , <=, ==, ecc. gli operatori possono essere sovraccaricati per altri scopi e possono restituire qualsiasi oggetto che gli piace. Non sto chiedendo i meriti di tale approccio, ma solo le differenze quando si utilizzano questi operatori per i confronti nello stesso senso che significano per i numeri.

Aggiornamento: As Christopher ha sottolineato, cmp sta scomparendo in 3.x. Ci sono alternative che rendano l'implementazione dei confronti facile come il __cmp__ sopra?