Я реализовал метод __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 ниже.