En the manual es dice:métodos mínimos de pedidos con Typing pato en Python 3.1
in general,
__lt__()
and__eq__()
are sufficient, if you want the conventional meanings of the comparison operators
pero veo el error:
> assert 2 < three
E TypeError: unorderable types: int() < IntVar()
cuando corro esta prueba:
from unittest import TestCase
class IntVar(object):
def __init__(self, value=None):
if value is not None: value = int(value)
self.value = value
def __int__(self):
return self.value
def __lt__(self, other):
return self.value < other
def __eq__(self, other):
return self.value == other
def __hash__(self):
return hash(self.value)
class DynamicTest(TestCase):
def test_lt(self):
three = IntVar(3)
assert three < 4
assert 2 < three
assert 3 == three
Me sorprende que cuando IntVar()
está a la derecha, __int__()
no se está llamando. ¿Qué estoy haciendo mal?
Adición __gt__()
reparar este problema, sino que significa que no entiendo cuáles son los requisitos mínimos son para ordenar ...
Gracias, Andrew
Si observa los [métodos de comparación de documentos enriquecidos] (http://docs.python.org/release/3.1.3/reference/datamodel.html#object.__lt__) menciona específicamente este comportamiento: 'Allí no hay versiones de argumentos intercambiados de estos métodos (para usar cuando el argumento de la izquierda no admite la operación pero sí el argumento de la derecha); más bien, __lt __() y __gt __() son reflejo el uno del otro, __le __() y __ge __() son reflejo el uno del otro, y __eq __() y __ne __() son su propio reflejo. Los argumentos para los métodos de comparación ricos nunca se fuerzan. – agf
@agf: Las respuestas deben estar en Respuestas, no en comentarios. –
@EthanFurman Los documentos no lo guían a través del caso específico como lo hace la respuesta de Sven, y la OMI es necesaria para merecer la publicación como una respuesta, no solo como un comentario. – agf