0

我知道猴子补丁是不受欢迎的(有充分的理由),但这只会出现在其他人不必处理的脚本中。而且我想更好地理解 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__属性时调用它会起作用?

4

0 回答 0