Перейти к содержанию

Семантика пагинации

PaginatedList[T] делает list-операции ленивыми: первая страница загружается сразу, а последующие страницы читаются только при обращении к данным за пределами уже загруженного диапазона.

sequenceDiagram
    participant App as Код
    participant PageList as PaginatedList
    participant Paginator as Paginator
    participant API as API

    App->>Paginator: list(limit=50)
    Paginator->>API: page 1
    API-->>Paginator: first page
    Paginator-->>App: PaginatedList
    App->>PageList: items[0]
    PageList-->>App: cached item
    App->>PageList: materialize()
    PageList->>API: next pages
    API-->>PageList: remaining items

Почему не обычный list

Обычный list[T] заставил бы SDK либо загружать все страницы сразу, либо скрывать сетевые запросы внутри уже материализованного типа. PaginatedList[T] явно показывает, что чтение коллекции может вызвать дополнительные запросы.

Гарантии

Первая страница загружается при создании результата. Повторный доступ к уже загруженным элементам не делает новый HTTP-запрос. materialize() дочитывает все страницы ровно один раз. Ошибка на следующей странице поднимается в момент обращения к этой странице, а не при создании первой.

Что документировать в public API

Если метод возвращает PaginatedList[T] runtime, его аннотация тоже должна быть PaginatedList[T]. Аннотация list[T] для ленивого результата считается нарушением контракта: пользователь не увидит, где возможны сетевые запросы.

Практический пример есть в how-to по объявлениям, полный контракт — в reference по пагинации.