我知道猴子补丁是不受欢迎的(有充分的理由),但这只会出现在其他人不必处理的脚本中。而且我想更好地理解 Python :)
如果切片的边界超过被切片事物的长度,Python 不会抛出错误。例如:
>>> 'abc'[10:20]
''
这一切都很好,但是如果您想抛出错误怎么办?具体来说,当使用 Numpy 数组时。我想要类似的东西
# This will not work!
import numpy as np
old_getitem = np.array.__getitem__
def new_getitem(self, val):
if isinstance(val, slice):
if val.stop >= len(self):
raise IndexError
return old_getitem(self, val)
np.array__getitem__ = new_getitem
但这不起作用,因为 np.array 没有__getitem__
属性
>>> np.array.__getitem__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'builtin_function_or_method' object has no attribute '__getitem__'
我觉得奇怪的是以下工作:
>>> a = np.array([1, 2, 3])
>>> a.__getitem__(slice(0,2))
array([1, 2])
我的第一个猜测是 Numpy 正在使用父类的属性,但是(据我所知)它没有“builtin_function_or_method”
所以我有两个问题。可以做我愚蠢的猴子补丁吗?为什么__getitem__
在 Numpy 数组没有__getitem__
属性时调用它会起作用?