1

下面的例子:

import numpy as np

class SimpleArray(np.ndarray):

    __array_priority__ = 10000

    def __new__(cls, input_array, info=None):
        return np.asarray(input_array).view(cls)

    def __eq__(self, other):
        return False

a = SimpleArray(10)
print (np.int64(10) == a)
print (a == np.int64(10))

给出以下输出

$ python2.7 eq.py
True
False

所以在第一种情况下,SimpleArray.__eq__不被调用(因为它应该总是 return False)。这是一个错误,如果是这样,任何人都可以想到解决方法吗?如果这是预期的行为,我如何确保SimpleArray.__eq__在这两种情况下都被调用?

编辑:只是为了澄清,这只发生在 Numpy 标量数组中 - 对于普通数组,__eq__总是被调用,因为它__array_priority__告诉 Numpy 它应该始终执行它,__eq__即使对象位于相等操作的 RHS 上:

b = SimpleArray([1,2,3])

print(np.array([1,2,3]) == b)
print(b == np.array([1,2,3]))

给出:

False
False

因此,对于标量 Numpy 'arrays',__array_priority__似乎没有得到尊重。

4

3 回答 3

1

这介于虫子和疣之间。当你调用a op bandbapython 的一个子类时,检查是否b有一个反射版本op并且调用它(__eq__是它自己的反射版本),例如,这np.array(10) == a给出了预期的结果,因为 SimpleArray 是 ndarray 的子类。但是,由于 SimpleArray 不是 np.int64 的实例,因此它在您提供的示例中不起作用。这实际上可能很容易解决 numpy 问题,因此您可以考虑将其放在邮件列表中。

于 2013-07-04T13:37:05.397 回答
0

默认情况下,等式表达式a == b调用A.__eq__()where Ais the class of variable a。这意味着左操作数的类型决定了调用哪个相等函数。确保调用您编写的相等函数的唯一方法是确保您的变量始终是左操作数。但是,如果左操作数没有相等的功能,python 会尝试调用B.__eq__()

于 2013-07-04T13:19:53.307 回答
0

如果other是不同的类型,则运算符方法(例如)__eq__需要第二个反射函数,该函数知道如何处理相反方向的比较。由于__eq__没有反向,而是使用__cmp__及其反向,__rcmp__.

另请参阅http://docs.python.org/2/reference/datamodel.html#basic-customization

于 2013-07-04T13:24:45.840 回答