__cmp__ méthode est ce ne fonctionne pas comme prévu en Python 2.x?
-
23-09-2019 - |
Question
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)
La sortie ici est:
cmp method called with self=hello,other=there
True
False
Ce qui est pas ce que je pensais. Je suis en train de dire « deux instances sont égales si les champs de nom sont égaux »
Si je return False
simplement de la fonction __cmp__
, ce que rapporte True
aussi bien !!
Si je reviens -1
, je reçois False
-. Mais depuis que je suis en train de comparer des chaînes, cela ne vous semble pas
Qu'est-ce que je fais mal ici?
La solution
__cmp__(x,y)
doit renvoyer une valeur négative (par exemple -1) si x < y
, un nombre positif (par exemple 1) si x > y
et 0 si x == y
. Vous ne devriez jamais retourner un booléen avec.
Qu'est-ce que vous surcharge est __eq__(x, y)
.
Autres conseils
la méthode de __cmp__
doit retourner -1, 0 ou 1, lorsque l'auto
Vous pouvez faire
return cmp(self.name, other.name)
dans votre code pour un bon résultat
Vous confondez __cmp__
avec __eq__
.
doit retourner un entier négatif si l'auto
autre.
__eq__
renvoie une valeur booléenne qui détermine si deux objets sont égaux, __cmp__
renvoie un entier qui détermine si les deux objets sont supérieures ou inférieures à l'autre, et est donc appelé à moins d'avoir __eq__
spécifique, __ne__
, __le__
, __ge__
, __lt__
et les méthodes de __gt__
.
Dans votre cas, vous voulez une méthode __cmp__
plutôt que __eq__
comme cela vous évitera la mise en œuvre des autres 5 méthodes pour les autres comparaisons.
Vous pouvez utiliser la fonction cmp()
et mettre ce qui suit dans votre méthode de __cmp__
:
return cmp(self.name,other.name)
Remarque, comme le souligne Ignacio est n'est pas la méthode préférée Python 3.0, mais en Python 2.x __cmp__
est le chemin à parcourir.
__cmp__()
est obsolescent. Définir __lt__()
, __eq__()
et __gt__()
à la place.
Même si, vous le faites mal. Vous êtes censé retourner un entier.
Lookup la documentation __cmp__
, vous êtes censé retourner un entier:
doit renvoyer un entier négatif si auto
autre.