pitone prefers to use rich comparison functions (__eq__
, __lt__
, __neq__
, ecc), ma se questi mancano, si torna a utilizzare una sola funzione di confronto (__cmp__
, rimosso in Python 3):
Questi sono i cosiddetti metodi di "confronto ricco" e sono chiamati per gli operatori di confronto preferibilmente a __cmp__()
di seguito.
Il Python 2 integer type non implementa una ricca funzione di confronto:
PyTypeObject PyInt_Type = {
...
(cmpfunc)int_compare, /* tp_compare */
...
0, /* tp_richcompare */
In Python 3, il integer type (ora una lunga) implementa solo una ricca funzione di confronto, dal momento che Python 3 cessato il supporto per __cmp__
:
PyTypeObject PyLong_Type = {
...
long_richcompare, /* tp_richcompare */
Questo è il motivo per cui (123).__eq__
non esiste. Invece, Python 2 ricade (123).__cmp__
quando si verifica l'uguaglianza di due numeri interi:
>>> (1).__eq__(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__eq__'
>>> (1).__cmp__(2)
-1
http://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in- quale ordine guarda alcune risposte qui, penso che lo spieghino bene – sjr59
ipotesi selvaggia, ma 'dall'operatore import eq; eq (2,2) 'funziona in Python2. O quello o usando '__cmp__' –
' esiste un .__ cmp__', che potrebbe essere ciò che Python 2 sta usando. – Blender