W the manual to mówi:Minimalne Sposoby zamawiania z kaczka wpisywanie w Pythonie 3.1
in general,
__lt__()
and__eq__()
are sufficient, if you want the conventional meanings of the comparison operators
Ale widzę błąd:
> assert 2 < three
E TypeError: unorderable types: int() < IntVar()
kiedy uruchomić ten test:
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
Jestem zaskoczony, że kiedy IntVar()
jest po prawej stronie, __int__()
nie jest wywoływany. Co ja robię źle?
Dodawanie __gt__()
poprawki, ale oznacza, że nie rozumieją, co minimalne wymagania są do zamawiania ...
Dzięki, Andrew
Jeśli spojrzysz na [bogatą metodę porównawczą docs] (http://docs.python.org/release/3.1.3/reference/datamodel.html#object.__lt__), to w szczególności wspomina to zachowanie: 'There nie są wymienionymi wersjami tych metod (do użycia, gdy lewy argument nie obsługuje operacji, ale właściwy argument ma taką wartość); raczej __lt __() i __gt __() są wzajemnymi odbiciami, __le __() i __ge __() są odbiciem siebie nawzajem, a __eq __() i __ne __() są ich własnym odbiciem. Argumenty do bogatych metod porównania nigdy nie są wymuszane. " – agf
@agf: Odpowiedzi powinny być w odpowiedziach, a nie w komentarzach. –
@EthanFurman Dokumenty nie chodzą po tobie, jak w konkretnym przypadku, takim jak odpowiedź Svena, i IMO, które są niezbędne, aby zasługiwać na publikację jako odpowiedź, a nie tylko na komentarz. – agf