Trong the manual là nói:Phương pháp tối thiểu cho đặt hàng với Duck Typing bằng Python 3.1
in general,
__lt__()
and__eq__()
are sufficient, if you want the conventional meanings of the comparison operators
Nhưng tôi thấy lỗi:
> assert 2 < three
E TypeError: unorderable types: int() < IntVar()
khi tôi chạy thử nghiệm này:
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
Tôi ngạc nhiên khi IntVar()
ở bên phải, __int__()
không được gọi. Tôi đang làm gì sai?
Thêm __gt__()
bản sửa lỗi này, nhưng có nghĩa là tôi không hiểu những gì các yêu cầu tối thiểu là để đặt hàng ...
Cảm ơn, Andrew
Nếu bạn xem [tài liệu phương pháp so sánh phong phú] (http://docs.python.org/release/3.1.3/reference/datamodel.html#object.__lt__), nó đề cập cụ thể đến hành vi này - 'Có không có phiên bản đối số hoán đổi của các phương thức này (được sử dụng khi đối số bên trái không hỗ trợ hoạt động nhưng đối số phải làm); thay vào đó, __lt __() và __gt __() là sự phản ánh của nhau, __le __() và __ge __() là sự phản ánh của nhau, và __eq __() và __ne __() là sự phản ánh của chúng. Đối số cho các phương pháp so sánh phong phú không bao giờ bị ép buộc.' – agf
@agf: Câu trả lời phải nằm trong Câu trả lời, không có trong nhận xét. –
@EthanFurman Các tài liệu không hướng dẫn bạn mặc dù trường hợp cụ thể như câu trả lời của Sven, và IMO đó là cần thiết để công nhận việc đăng bài như một câu trả lời không chỉ là một bình luận. – agf