Я реализовал метод __contains__
для класса в первый раз на днях, и поведение не было тем, что я ожидал. Я подозреваю, что есть какая-то тонкость в in
, который я не понимаю, и я надеялся, что кто-то сможет просветить меня.
Мне кажется, что оператор in
не просто переносит метод объекта __contains__
, но также пытается принудительно вывести вывод __contains__
в boolean. Например, рассмотрим класс
class Dummy(object):
def __contains__(self, val):
# Don't perform comparison, just return a list as
# an example.
return [False, False]
Оператор in
и прямой вызов метода __contains__
возвращают очень разные результаты:
>>> dum = Dummy()
>>> 7 in dum
True
>>> dum.__contains__(7)
[False, False]
Опять же, похоже, что in
вызывает __contains__
, но затем принуждает результат к bool
. Я не могу найти это поведение где-либо, кроме факта, что __contains__
документация говорит, что __contains__
должен возвращать только True
или False
.
Я счастлив, следуя конвенции, но может ли кто-нибудь сказать мне точную связь между in
и __contains__
?
Эпилог
Я решил выбрать ответ @eli-korvigo, но все должны смотреть на @ashwini-chaudhary comment о bug ниже.