【发布时间】:2021-07-10 04:07:25
【问题描述】:
以乘法运算符mul为例,代码
import numpy as np
v = 1.0
a = float(v)
b = np.float64(v)
print(type(a*b), type(a.__mul__(b)))
a = complex(v)
b = np.complex128(v)
print(type(a*b), type(a.__mul__(b)))
产生以下输出
<class 'numpy.float64'> <class 'float'>
<class 'numpy.complex128'> <class 'complex'>
由于<class 'float'>.__mul__(<class 'numpy.float64'>)和<class 'complex'>.__mul__(<class 'numpy.complex128'>)实际上并不返回NotImplemented,根据Python documentation结果应该分别是<class 'float'>和<class 'complex'>。
为什么不是这样?似乎内置数字类型的二元算术运算符(+、-、*、/ 等)的行为与其对应的 __op__() 函数不同?
【问题讨论】:
-
检查
b.__rmul__(a) -
b.__rmul__(a)在这两种情况下都是正确的。问题是为什么a.__mul__(b)在不 返回NotImplemented时会被忽略。 -
numpy对象优先级较高,并控制'*'的形式 -
这个优先级是什么?我似乎在 Python 文档中找不到任何关于此的内容。
-
我不记得我在哪里读到过这个优先级,可能是在其他一些 SO 中。这是一些相关的问题,处理 0d 数组和 numpy 'scalar' 之间的区别,stackoverflow.com/questions/66169279/…