Практическое использование операторов реверсивного набора в Python

Есть ли разница между использованием операторов обратного объединения или пересечения на множествах в Python?

например,

s & z соответствует s.__and__(z)

z & s соответствует s.__rand__(z)

Если они должны возвращать то же самое, почему в первую очередь стоит обратный оператор? Я что-то упускаю?

2 Solutions collect form web for “Практическое использование операторов реверсивного набора в Python”

set и frozenset следуют протоколу номера, и они явно не определяют обратные операции, но они получают эти «бесплатно», потому что они реализуют обычные методы (например, __and__ ) .

Однако обратные операции особенно полезны при работе с подклассами, потому что если правый операнд является подклассом левого операнда, сначала выполняется операция обратного действия . Но в случае простого set s и frozenset s это не имеет никакого значения, потому что они не наследуют друг от друга.

Эти обратные операции также используются, если первый операнд возвращает NotImplemented в __add__ . Но опять-таки это не очень полезно для set и frozenset потому что они разрешают только операции с другими set -alikes и по крайней мере set и frozenset не возвращают NotImplemented когда другой операнд – это другой set .

Также z & s не соответствует s.__rand__(z) , кроме случаев, когда s является подклассом z . В противном случае z.__and__(s) будут предприняты до s.__rand__(z) .

Поэтому я сомневаюсь, что существуют варианты использования обратного объединения и пересечения, но он должен объяснить «почему существуют эти методы».

__rand__ вызывается только в том случае, если левый операнд не поддерживает соответствующую операцию, а операнды имеют разные типы.

Я бы предположил, что s.__rand__(z) просто назовет z.__and__(s) под обложками.

Python - лучший язык программирования в мире.