2017-03-27 3 views
1

En python 2 ou 3, les classes intégrées ont explicitement la méthode spéciale définie. Explicit is better than implicit et tout ce jazz.Pourquoi les entiers manquent certaines méthodes spéciales dans python 2?

5. > 4. 
# True 
(5.).__ge__(4.) 
# True 

Mais dans Python 2 il y a des exceptions pour certaines méthodes, au moins dans les entiers.

5 > 4 
# True 
(5).__ge__(4) 
# AttributeError: 'int' object has no attribute '__ge__' 
# But not all of them fail! 
(5).__add__(4) 
# 9 

Quelle est la cause de ce comportement? Pourquoi a-t-il été conçu de cette façon?

J'utilise Python 2.7.12

+2

En Python-2.7, le '__cmp__' est utilisé. –

+1

https://docs.python.org/2.7/reference/datamodel.html#object.__cmp__ –

+1

vaut la peine de mentionner est que dans python3 '__cmp__' a été enlevé donc pour comp complet Vous devez définir comp. méthodes magiques. –

Répondre

1

Le data model a été mis à jour entre et . En on pourrait utiliser le __cmp__ method:

object.__cmp__(self, other)

Appelée par des opérations de comparaison si comparaison riche (voir ci-dessus) est non définie. Doit renvoyer un entier négatif si self < other, zéro si self == other, un entier positif si self > other. Si aucune opération, __eq__() ou __ne__() n'est définie, les instances de classe sont comparées par l'identité d'objet ("adresse"). Voir aussi la description de __hash__() pour quelques notes importantes sur créant des objets qui supportent les opérations de comparaison personnalisées et sont utilisables comme clés de dictionnaire. (Note: la restriction que exceptions ne sont pas propagées par __cmp__() a été supprimé depuis Python 1.5.)

(formatage ajouté)

La comparaison riche opérateurs sont les __le__, __ge__, etc.. Donc dans il y avait un mécanisme de repli supplémentaire . Il est défini pour un int, comme vous pouvez le voir avec:

>>> (2).__cmp__ 
<method-wrapper '__cmp__' of int object at 0x13ee140> 
>>> (2).__cmp__(3) 
-1 

(Python 2.7.12)

De plus offre une cmp(..) builtin function:

cmp(x, y)

Comparer les deux objets x et y et renvoyer un entier selon le résultat.La valeur de retour est négative si x < y, zéro si x == y et strictement positive si x > y.

(formatage ajouté)

En , la __cmp__ a été supprimé comme vous pouvez le lire dans le What’s New In Python 3.0:

La fonction cmp() doit être traitée comme disparu, et la __cmp__() La méthode spéciale n'est plus supportée. Utilisez __lt__() pour le tri, __eq__() avec __hash__(), et d'autres riches comparaisons en fonction des besoins. (Si vous avez vraiment besoin de la fonctionnalité cmp(), vous pouvez utiliser l'expression (a > b) - (a < b) comme l'équivalent pour cmp(a, b).)

(formatage ajouté)

Ce mécanisme est non seulement une enveloppe autour __cmp__: il va d'abord regarder s'il y a riches comparaisons et si pas de repli sur __cmp__ lui-même.

+0

Vous avez raison! Donc, pour une raison quelconque, la classe 'int' n'a jamais été mise à jour lorsque les nouvelles méthodes sont arrivées. – durum

+0

@durum: Dans Python-3.x, 'int' n'a qu'un' __le__', etc., pas un '__cmp__', donc il a été mis à jour. Êtes-vous sûr de l'avoir exécuté dans Python-3.x? –

+0

Je parlais de python-2x. Les flottants ont été mis à jour en python-2x, mais pas les entiers. – durum