Python 中反转集运算符的实际使用

Practical Use of Reversed Set Operators in Python

在Python中对集合使用反向并集或交集运算符有什么区别吗?

例如,

s & z对应s.__and__(z)

z & s对应s.__rand__(z)

如果这些应该 return 相同的东西,为什么首先要有反向运算符?我错过了什么吗?

__rand__仅在左操作数不支持对应操作且操作数类型不同时调用

我想 s.__rand__(z) 会在幕后调用 z.__and__(s)

setfrozenset 遵循号码协议,他们 don't define the reversed operations explicitly but they get these "for free" because they implement the normal methods (like __and__).

然而,反向操作在处理子类时特别有用,因为如果 right operand is a subclass of the left operand the reversed operation is attempted first。但是对于普通 sets 和 frozensets 这没有任何区别,因为它们不会相互继承。

如果第一个操作数 returns NotImplemented 在它的 __add__ 中,也使用这些反向操作。但这对 setfrozenset 来说并不是很有用,因为它们只允许与其他 set 类似的操作,至少 setfrozenset 不允许t return NotImplemented 当另一个操作数是另一个 set 时。

此外 z & s 不对应于 s.__rand__(z),除非 sz 的子类。否则 z.__and__(s) 将在 s.__rand__(z).

之前尝试

所以我怀疑反向并集和交集是否有用例,但它应该解释 "why these methods exist"。