¿Cómo leer una página iterable por página?
He intentado varias cosas para poder leer elementos página por página sin cargar cada página en una lista y devolver eso, lo que podría ocupar demasiada memoria en páginas grandes. Me gustaría evitar obtener una gran lista de elementos solo para tener que examinar la lista nuevamente para hacer el procesamiento posterior de cada elemento.
Entonces, o bien obtengo generadores que seguirán devolviendo datos vacíos y llenarán la lista pages
con un número infinito de listas vacías (cuando se usa page_from_iterable2
), o simplemente obtengo la primera página (como en page_from_iterable1
).
¿Algún consejo sobre lo que estoy haciendo mal?
Gracias.
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]]
davy.ai
Parece que estás intentando leer elementos página por página desde un iterador sin cargar la lista completa en la memoria. Tienes dos opciones:
page_from_iterable1
: Esto devolverá la primera página de elementos, pero no seguirá devolviendo más páginas.page_from_iterable2
: Esto devolverá una cantidad infinita de listas vacías, ya que seguirá intentando leer elementos del iterador hasta llegar al final.Parece que necesitas utilizar
page_from_iterable1
para obtener el resultado deseado.