__cmp__ metodo non funziona come previsto in Python 2.x?
-
23-09-2019 - |
Domanda
class x:
def __init__(self,name):
self.name=name
def __str__(self):
return self.name
def __cmp__(self,other):
print("cmp method called with self="+str(self)+",other="+str(other))
return self.name==other.name
# return False
instance1=x("hello")
instance2=x("there")
print(instance1==instance2)
print(instance1.name==instance2.name)
L'output è:
cmp method called with self=hello,other=there
True
False
che non è quello che mi aspettavo. Io sto cercando di dire 'due casi sono uguali se i campi del nome sono uguali'
Se ho semplicemente return False
dalla funzione __cmp__
, questo segnala come True
pure !!
Se torno -1
, poi mi False
-. Ma dato che sto cercando di confrontare le stringhe, questo non si sente giusto
Che cosa sto facendo male qui?
Soluzione
__cmp__(x,y)
dovrebbe restituire un numero negativo (ad esempio -1) se x < y
, un numero positivo (ad esempio 1) se x > y
e 0 se x == y
. Non si dovrebbe mai restituire un valore booleano con esso.
Quello che stai sovraccaricare è __eq__(x, y)
.
Altri suggerimenti
il metodo __cmp__
deve restituire -1, 0 o 1, quando sé
Si può fare
return cmp(self.name, other.name)
nel codice per ottenere un risultato corretto
Si sta confondendo __cmp__
con __eq__
.
Dalla documentazione di __cmp__
:
Dovrebbe restituire un intero negativo se self
altro.
__eq__
restituisce un booleano che determina se due oggetti sono uguali, __cmp__
restituisce un intero che determina se i due oggetti sono superiori o inferiori a vicenda, e così è chiamato a meno che lo specific __eq__
, __ne__
, __le__
, __ge__
, __lt__
e metodi __gt__
.
Nel tuo caso si vuole un metodo __cmp__
piuttosto che __eq__
in quanto vi farà risparmiare l'attuazione delle altre 5 metodi per gli altri confronti.
È possibile utilizzare il cmp()
funzione e inserire il seguente nel metodo __cmp__
:
return cmp(self.name,other.name)
Nota, come evidenziato da Ignacio è presente non è il metodo preferito in Python 3.0 , ma in Python 2.x __cmp__
è la strada da percorrere.
__cmp__()
è obsoleta. Definire __lt__()
, __eq__()
e __gt__()
invece.
Anche così, si sta facendo male. Si suppone di restituire un numero intero.
Lookup la documentazione per __cmp__
, youre supposto per restituire un intero:
Dovrebbe restituire un intero negativo se auto
altri.