gpt4 book ai didi

python - 为什么新旧样式的 python 类在将切片传递给 __getitem__ 的方式上有所不同

转载 作者:太空宇宙 更新时间:2023-11-04 00:31:55 26 4
gpt4 key购买 nike

调试一些东西我注意到了这个区别:

class A:
def __getitem__(self, x):
print x

class B(object):
def __getitem__(self, x):
print x

a = A()

b = B()

然后

>>> a[2:]
slice(2, 9223372036854775807, None)
>>> b[2:]
slice(2, None, None)

>>> a[:2]
slice(0, 2, None)
>>> b[:2]
slice(None, 2, None)

我基本上了解到,旧式类将为 slice 的开始和停止参数提供数字 (0/INT_MAX),(尽管 step 是一个有趣的异常(exception))。

但是我很好奇,为什么?什么样的实现细节会导致这种情况。

最佳答案

您正在寻找的实现细节是旧式实例的类型——不是旧式类,而是类型——实现了__getslice__。 . __getslice__是旧的切片实现方式,当使用__getslice__时,未提供的左右切片端点被转换为0和sys.maxsize 分别在调用 __getslice__ 之前。

该类型的 __getslice__ 然后在类中查找 __getslice__ 方法,没有找到,并使用您的 __getitem__ 方法,构造并传递给它一个切片,但是 sys.maxsize 转换已经发生。

您可以在Objects/classobject.c 中看到__getslice__ 的实现。作为 instance_slice。请注意,C 函数采用两个 Py_ssize_t 整数作为切片端点,并且没有任何未提供端点的概念。

关于python - 为什么新旧样式的 python 类在将切片传递给 __getitem__ 的方式上有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45495980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com