Каковы имена магических методов для операторов "есть" и "in"?
Я хотел бы сделать двоичные операции bool, используя магические методы для этих операторов. Например, я могу получить a < b
как getattr(a, '__lt__')(b)
или a == b
как getattr(a, '__eq__')(b)
.
Могу ли я получить a in b
и a is b
таким образом?
Ответы
Ответ 1
in
__contains__
и is
не имеет метода dunder. Я настоятельно рекомендую вам использовать функции в operator
module:
a < b => operator.lt(a, b)
a == b => operator.eq(a, b)
a in b => operator.contains(a, b)
a is b => operator.is_(a, b)
Ответ 2
Для in
правильный метод dunder __contains__
.
Нет метода для is
, потому что это эквивалентно id(a) == id(b)
. Он сравнивает фактический идентификатор объекта, используемый под капотом Python, поэтому используется для сравнения идентичности объекта, а не содержимого объекта. Перезапись его внутри класса нарушит объектную модель Python, поэтому она не разрешена.
Ответ 3
__contains__
верен для in
, с параметрами отбрасывания, если __contains__
не определено __iter__
и __getitem__
.
Я не уверен, почему вам нужно использовать getattr
для is
, хотя; is
"определен" для каждого объекта в Python. Нет необходимости проходить через operator._is
или (попытка и провал) через getattr
.
См. документацию по встроенным типам:
Поведение операторов is
и is not
невозможно настроить; также они могут применяться к любым двум объектам и никогда не создавать исключение.
(Акцент мой)
В соответствии с предоставленными вами фрагментами, которые просто захватывают функцию и вызывают ее с помощью getattr(a, "function")(b)
, у вас уже есть имена объектов, которые нужно оценить, просто используйте is
немедленно; он всегда доступен.