【发布时间】:2021-12-30 04:35:55
【问题描述】:
我尝试了很多方法来逐页读取项目,而无需将每个页面加载到列表中并返回,这可能会在大页面上占用太多内存。我想避免仅仅为了必须再次扫描列表以对每个项目进行后处理而获得大量项目列表。
所以要么我得到将不断返回空数据并用无限数量的空列表填充pages 列表的生成器(使用page_from_iterable2 时),或者我只得到第一页(如page_from_iterable1。
任何提示我做错了什么?
谢谢。
from typing import Iterable, Iterator
def read_paginated_items(
it: Iterator,
page_size: int,
) -> Iterable:
for _ in range(page_size):
try:
yield next(it)
except StopIteration:
return
def page_from_iterable1(
iterable: Iterable,
page_size: int,
) -> Iterable:
it = iter(iterable)
page_items_generator = read_paginated_items(it, page_size)
yield page_items_generator
def page_from_iterable2(
iterable: Iterable,
page_size: int,
) -> Iterable:
it = iter(iterable)
while page_items_generator := read_paginated_items(it, page_size):
yield page_items_generator
def test_read_by_page():
pages = []
for page in page_from_iterable1([1, 2, 3, 4, 5], 2):
page_items = [item for item in page]
pages.append(page_items)
assert pages == [[1, 2], [2, 3], [5]]
【问题讨论】: