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)
。
set
和 frozenset
遵循号码协议,他们 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。但是对于普通 set
s 和 frozenset
s 这没有任何区别,因为它们不会相互继承。
如果第一个操作数 returns NotImplemented
在它的 __add__
中,也使用这些反向操作。但这对 set
和 frozenset
来说并不是很有用,因为它们只允许与其他 set
类似的操作,至少 set
和 frozenset
不允许t return NotImplemented
当另一个操作数是另一个 set
时。
此外 z & s
不对应于 s.__rand__(z)
,除非 s
是 z
的子类。否则 z.__and__(s)
将在 s.__rand__(z)
.
之前尝试
所以我怀疑反向并集和交集是否有用例,但它应该解释 "why these methods exist"。
在Python中对集合使用反向并集或交集运算符有什么区别吗?
例如,
s & z
对应s.__and__(z)
z & s
对应s.__rand__(z)
如果这些应该 return 相同的东西,为什么首先要有反向运算符?我错过了什么吗?
__rand__
仅在左操作数不支持对应操作且操作数类型不同时调用
我想 s.__rand__(z)
会在幕后调用 z.__and__(s)
。
set
和 frozenset
遵循号码协议,他们 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。但是对于普通 set
s 和 frozenset
s 这没有任何区别,因为它们不会相互继承。
如果第一个操作数 returns NotImplemented
在它的 __add__
中,也使用这些反向操作。但这对 set
和 frozenset
来说并不是很有用,因为它们只允许与其他 set
类似的操作,至少 set
和 frozenset
不允许t return NotImplemented
当另一个操作数是另一个 set
时。
此外 z & s
不对应于 s.__rand__(z)
,除非 s
是 z
的子类。否则 z.__and__(s)
将在 s.__rand__(z)
.
所以我怀疑反向并集和交集是否有用例,但它应该解释 "why these methods exist"。