【发布时间】:2018-05-14 14:45:22
【问题描述】:
我有一个小助手类:
class AnyOf(object):
def __init__(self, *args):
self.elements = args
def __eq__(self, other):
return other in self.elements
这让我可以做一些甜蜜的魔法,比如:
>>> arr = np.array([1,2,3,4,5])
>>> arr == AnyOf(2,3)
np.array([False, True, True, False, False])
无需使用列表推导(如np.array(x in (2,3) for x in arr)。
(我维护的 UI 允许(受信任的)用户输入任意代码,a == AnyOf(1,2,3) 对于非技术性用户来说比列表理解更可口。)
但是!
这只有一种方式!例如,如果我要做AnyOf(2,3) == arr,那么我的AnyOf 类的__eq__ 方法永远不会被调用:相反,NumPy 数组的__eq__ 方法被调用,它在内部(我认为)调用__eq__ 方法它的所有元素。
这让我想知道:为什么 Python 不允许右侧等价于 __eq__? (大致相当于__radd__、__rmul__ 等方法。)
【问题讨论】:
-
"为什么 Python 没有 X?"不太可能是一个非常有成效的问题。如果您希望 Python 拥有 X,实现这一目标的有效方法是关注 the process in PEP-1 来实际提出这个想法,并从对添加到语言中的内容有发言权的人那里获得反馈。否则,“有没有办法在 Python 中获得 X 的有用效果?”实际上更有可能立即产生有用的结果(例如产生光而不是热量)。
-
实际上,在上面的示例中,我无法认识到对类的迫切需求。为什么不使用一个简单的函数,它返回一个列表?
-
请注意,如果您有一些较大的数组,则此“魔术”将比
np.in1d之类的要慢得多。 -
通常,
__eq__应该返回NotImplemented而不是False,除非绝对确定值不同。
标签: python numpy python-internals python-datamodel