Tôi đã thực hiện phương thức __contains__
trên lớp lần đầu tiên vào ngày khác và hành vi không phải là những gì tôi mong đợi. Tôi nghi ngờ có một số tinh tế để các nhà điều hành in
mà tôi không hiểu và tôi đã hy vọng một người nào đó có thể soi sáng cho tôi.Chức năng của Python `in` so với` __contains__`
Dường như với tôi rằng toán tử in
không đơn giản quấn phương thức __contains__
của đối tượng, nhưng nó cũng cố gắng ép buộc đầu ra của __contains__
thành boolean. Ví dụ, hãy xem xét các lớp
class Dummy(object):
def __contains__(self, val):
# Don't perform comparison, just return a list as
# an example.
return [False, False]
Nhà điều hành in
và một cuộc gọi trực tiếp đến __contains__
phương thức hoàn trả sản lượng rất khác nhau:
>>> dum = Dummy()
>>> 7 in dum
True
>>> dum.__contains__(7)
[False, False]
Một lần nữa, nó trông giống như in
đang kêu gọi __contains__
nhưng sau đó ép buộc kết quả đến bool
. Tôi không thể tìm thấy hành vi này được ghi lại ở bất kỳ đâu ngoại trừ thực tế là __contains__
documentation nói __contains__
chỉ nên trả lại True
hoặc False
.
Tôi hài lòng theo quy ước, nhưng ai đó có thể cho tôi biết mối quan hệ chính xác giữa in
và __contains__
?
Epilogue
tôi quyết định chọn câu trả lời @ eli-korvigo, nhưng tất cả mọi người nên nhìn vào @ Ashwini-Chaudhary comment về bug, bên dưới.
Vì trả về phương thức chứa của bạn tương đương với bool ([Sai, False]) – x1Mike7x
Lỗi liên quan: ['in' phải nhất quán với giá trị trả về' __contains__'] (https://bugs.python.org/issue16011) –
@AshwiniChaudhary: Bạn có thể viết nhận xét này làm câu trả lời không? Chỉ cần một lót hoặc như vậy là tốt. Tôi chưa bao giờ thấy báo cáo lỗi này và nó trả lời chính xác câu hỏi của tôi. Tôi không quan tâm nhiều đến việc triển khai cụ thể của 'in' khi tôi quan tâm đến lý do thiết kế và thiếu tài liệu rõ ràng. Nếu bạn đăng câu trả lời này, tôi sẽ chọn câu trả lời của bạn làm câu trả lời. –