__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?

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers

News


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method