gpt4 book ai didi

python - 为什么 UserList 子类似乎返回错误的切片类型?

转载 作者:行者123 更新时间:2023-11-30 23:16:55 26 4
gpt4 key购买 nike

首先让我说我明白为什么要子类化 list无法按您的预期工作(因为 list 是原始内置类型,并且存在性能问题等)。 AFAIK collections.UserList 应该避免所有这些问题,并使子类化 UserList 完全按照您的预期工作。例如,

class DumbList(list):
pass
d1 = DumbList([1,2,3])
d2 = DumbList([4,5])
type(d1 + d2)

返回<class 'list'> ,但是

from collections import UserList
class DumbList(UserList):
pass
d1 = DumbList([1,2,3])
d2 = DumbList([4,5])
type(d1 + d2)

返回<class '__main__.DumbList'>正如预期的那样。但是,即使使用 UserList ,切片似乎也会返回错误的类型。而不是list :

class DumbList(UserList):
pass
d = DumbList([1,2,3])
type(d[:2])

返回<class 'list'> ,不是<class '__main__.DumbList'>正如预期的那样。

两个问题:

  • 这是为什么?
  • 我应该怎样做才能使切片返回正确的类型?我能想到的最简单的事情是:

 

class DumbList(UserList):
def __getitem__(self, item):
result = UserList.__getitem__(self, item)
try:
return self.__class__(result)
except TypeError:
return result

...但似乎这种样板代码应该是不必要的。

最佳答案

在 Python 2 中,普通切片(没有跨步)将由 __getslice__ method 处理。 。 UserList 实现早于将扩展切片(带跨度)添加到语言中,并且从未添加对它们的支持,请参阅 issue 491398 .

Python 3 实现只是采用了 Python 2 版本,移至 collections 中,并删除了 __getslice____setslice__,因为它们不再受支持Python 3。

因此,__getitem__ 实现仍然很简单:

def __getitem__(self, i): return self.data[i]

假设切片将在其他地方处理。

在 Python 3 中,所有切片都是通过传入 slice() built-in type 来处理的。到__getitem__;只需测试该类型并将结果包装在 type(self) 调用中:

def __getitem__(self, i):
res = self.data[i]
return type(self)(res) if isinstance(i, slice) else res

关于python - 为什么 UserList 子类似乎返回错误的切片类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27552379/

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