gpt4 book ai didi

python - 故障排除 'itertools.chain' 对象没有属性 '__getitem__'

转载 作者:行者123 更新时间:2023-11-28 21:22:48 26 4
gpt4 key购买 nike

我在 Python 中使用 itertools.chain 方法将几个 Django Querysets 链接在一起。通过这样做,我没有接触数据库,这是我需要的高效行为。但是,我正在使用第三方库对这些结果进行分页,并且该库只接受列表和查询集对象。使用链对象调用它时出现以下错误:

Exception Value: 'itertools.chain' object has no attribute '__getitem__'

图书馆 ( django-pagemore ) 中真正让我发疯的那行是:

objects = self.objects[page0*self.per_page:1+page*self.per_page]

这里的问题是当使用链时你不能对它进行切片。

我知道我可以使用 list() 方法轻松地将链对象转换为列表,但这会评估整个查询集,并且其中可能包含数千个项目。

经过对 how to calculate the size of a Python object 的研究我做了一些测试并使用 sys.getsizeof(cPickle.dumps(content)) (其中 content 是链中的对象之一)给我一个值 15,915 字节,因此包含 3,000 个这些对象的链大约需要 45.53 MB!

最佳答案

itertools.chain() 返回一个可迭代,而不是一个序列。您不能对可迭代对象进行索引或切片。

使用itertools.islice()定义一个子集;当遍历 islice() 结果时,底层的可迭代对象将被推进到起始索引,然后将产生项目直到结束索引:

objects = islice(self.objects, page0 * self.per_page, 1 + page * self.per_page)

这会迭代链式序列,因此您无法访问 start 索引之前的项目。

关于python - 故障排除 'itertools.chain' 对象没有属性 '__getitem__',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232132/

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