Подтвердить что ты не робот

Каковы имена магических методов для операторов "есть" и "in"?

Я хотел бы сделать двоичные операции bool, используя магические методы для этих операторов. Например, я могу получить a < b как getattr(a, '__lt__')(b) или a == b как getattr(a, '__eq__')(b).

Могу ли я получить a in b и a is b таким образом?

4b9b3361

Ответ 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 немедленно; он всегда доступен.