pagination
core.pagination
分页与换一批核心组件定义.
IteratorStrategy
PagerStrategy
PageStrategy
PageStrategy(
page_key: str,
*,
has_more_extractor: Callable[
[T_Resp_contra], bool | None
]
| None = None,
total_extractor: Callable[[T_Resp_contra], int | None]
| None = None,
count_extractor: Callable[[T_Resp_contra], int | None]
| None = None,
page_size: int | None = None,
start_page: int = 1,
)
Bases: PagerStrategy[T_Resp_contra], Generic[T_Resp_contra]
基于页码的翻页策略.
初始化基于页码的翻页策略.
| PARAMETER | DESCRIPTION |
|---|---|
page_key
|
页码参数名.
TYPE:
|
has_more_extractor
|
是否还有更多数据的提取方式.
TYPE:
|
total_extractor
|
总数提取方式.
TYPE:
|
count_extractor
|
当前页条目数量提取方式.
TYPE:
|
page_size
|
每页条数.
TYPE:
|
start_page
|
起始页码.
TYPE:
|
Source code in qqmusic_api/core/pagination.py
has_next
has_next(
params: PaginationParams, response: T_Resp_contra
) -> bool
判断是否还能继续翻页.
Source code in qqmusic_api/core/pagination.py
next_params
获取下一次请求的参数.
Source code in qqmusic_api/core/pagination.py
OffsetStrategy
OffsetStrategy(
offset_key: str,
*,
page_size_key: str | None = None,
page_size: int | None = None,
start_offset: int = 0,
has_more_extractor: Callable[
[T_Resp_contra], bool | None
]
| None = None,
total_extractor: Callable[[T_Resp_contra], int | None]
| None = None,
count_extractor: Callable[[T_Resp_contra], int | None]
| None = None,
)
Bases: PagerStrategy[T_Resp_contra], Generic[T_Resp_contra]
基于偏移量窗口的翻页策略.
初始化偏移量策略.
| PARAMETER | DESCRIPTION |
|---|---|
offset_key
|
偏移量参数名.
TYPE:
|
page_size_key
|
每页条数参数名.
TYPE:
|
page_size
|
固定每页条数.
TYPE:
|
start_offset
|
起始偏移量.
TYPE:
|
has_more_extractor
|
是否还有更多数据的提取方式.
TYPE:
|
total_extractor
|
总数提取方式.
TYPE:
|
count_extractor
|
当前页实际返回数量提取方式.
TYPE:
|
| RAISES | DESCRIPTION |
|---|---|
ValueError
|
当 page_size_key 和 page_size 同时缺失时抛出. |
Source code in qqmusic_api/core/pagination.py
has_next
has_next(
params: PaginationParams, response: T_Resp_contra
) -> bool
检查是否有下一页.
Source code in qqmusic_api/core/pagination.py
next_params
获取下一页的请求参数.
Source code in qqmusic_api/core/pagination.py
CursorStrategy
CursorStrategy(
cursor_key: str,
*,
cursor_extractor: Callable[[T_Resp_contra], Any],
has_more_extractor: Callable[
[T_Resp_contra], bool | None
]
| None = None,
count_extractor: Callable[[T_Resp_contra], int | None]
| None = None,
page_size: int | None = None,
)
Bases: PagerStrategy[T_Resp_contra], Generic[T_Resp_contra]
基于响应游标回写的翻页策略.
初始化游标翻页策略.
| PARAMETER | DESCRIPTION |
|---|---|
cursor_key
|
下一页游标写回的请求参数名.
TYPE:
|
cursor_extractor
|
下一页游标提取方式. |
has_more_extractor
|
是否还有更多数据的提取方式.
TYPE:
|
count_extractor
|
当前页条目数量提取方式.
TYPE:
|
page_size
|
每页条数.
TYPE:
|
Source code in qqmusic_api/core/pagination.py
has_next
has_next(
params: PaginationParams, response: T_Resp_contra
) -> bool
检查是否有下一页.
Source code in qqmusic_api/core/pagination.py
next_params
获取下一页的请求参数.
BatchRefreshStrategy
BatchRefreshStrategy(
refresh_key: str,
*,
cursor_extractor: Callable[[T_Resp_contra], Any],
has_more_extractor: Callable[
[T_Resp_contra], bool | None
]
| None = None,
count_extractor: Callable[[T_Resp_contra], int | None]
| None = None,
page_size: int | None = None,
allow_repeat: bool = False,
)
Bases: CursorStrategy[T_Resp_contra]
基于上一批结果标记换一批内容的策略.
初始化换一批策略.
| PARAMETER | DESCRIPTION |
|---|---|
refresh_key
|
下一次请求需要替换的参数名.
TYPE:
|
cursor_extractor
|
下一批刷新参数提取方式. |
has_more_extractor
|
是否还有更多数据的提取方式.
TYPE:
|
count_extractor
|
当前页条目数量提取方式.
TYPE:
|
page_size
|
每页条数.
TYPE:
|
allow_repeat
|
是否允许在游标不变或无新游标时重复刷新.
TYPE:
|
Source code in qqmusic_api/core/pagination.py
has_next
has_next(
params: PaginationParams, response: T_Resp_contra
) -> bool
检查是否有下一批.
Source code in qqmusic_api/core/pagination.py
MultiFieldContinuationStrategy
MultiFieldContinuationStrategy(
build_next_params: NextParamsBuilder[T_Resp_contra],
*,
has_more_extractor: Callable[
[T_Resp_contra], bool | None
]
| None = None,
count_extractor: Callable[[T_Resp_contra], int | None]
| None = None,
page_size: int | None = None,
context_name: str = "continuation",
)
Bases: PagerStrategy[T_Resp_contra], Generic[T_Resp_contra]
基于多字段 continuation 更新的翻页策略.
初始化多字段延续翻页策略.
| PARAMETER | DESCRIPTION |
|---|---|
build_next_params
|
根据当前请求与响应构造下一页完整参数的函数.
TYPE:
|
has_more_extractor
|
是否还有更多数据的提取方式.
TYPE:
|
count_extractor
|
当前页条目数量提取方式.
TYPE:
|
page_size
|
每页条数.
TYPE:
|
context_name
|
错误上下文中的策略名称.
TYPE:
|
Source code in qqmusic_api/core/pagination.py
has_next
has_next(
params: PaginationParams, response: T_Resp_contra
) -> bool
检查是否有下一页.
Source code in qqmusic_api/core/pagination.py
next_params
AwaitableRequest
PaginatedRequestProtocol
Bases: Protocol[RequestResultT]
分页请求协议.
用于定义可分页请求对象的鸭子类型约束.
实现此协议的类必须是可等待的 (Awaitable), 并且能够根据上一次的响应数据生成下一页的请求对象.
next_request
next_request(
previous_response: RequestResultT,
) -> PaginatedRequestProtocol[RequestResultT] | None
ItemPaginatedRequestProtocol
Bases: PaginatedRequestProtocol[RequestResultT], Protocol[RequestResultT, ItemT_co]
约束宿主同时具备分页协议与数据项提取能力 (仅供外部类型标注使用).
AsyncPager
AsyncPager(
initial_request: PaginatedRequestProtocol[
RequestResultT
],
limit: int | None = None,
)
Bases: Generic[RequestResultT]
有状态异步分页器.
初始化异步分页器.
| PARAMETER | DESCRIPTION |
|---|---|
initial_request
|
初始翻页请求描述符.
TYPE:
|
limit
|
最大可拉取页数限制.
TYPE:
|
Source code in qqmusic_api/core/pagination.py
first
async
获取或拉取首批/首页响应数据.
| RETURNS | DESCRIPTION |
|---|---|
RequestResultT
|
首个页面响应对象. |
| RAISES | DESCRIPTION |
|---|---|
StopAsyncIteration
|
当达到 limit 且第一页尚未拉取时抛出. |
Source code in qqmusic_api/core/pagination.py
next
async
拉取并返回下一页响应数据.
| RETURNS | DESCRIPTION |
|---|---|
RequestResultT
|
下一页的响应对象. |
| RAISES | DESCRIPTION |
|---|---|
StopAsyncIteration
|
当没有更多页或达到 limit 时抛出. |
Source code in qqmusic_api/core/pagination.py
ItemMixin
dataclass
Bases: ABC, Generic[RequestResultT, ItemT_co]
单次请求数据提取接口.
提供执行单次请求并从中提取数据项的能力. 必须与具备 __await__ 方法的请求类组合使用.
| ATTRIBUTE | DESCRIPTION |
|---|---|
items_extractor |
接收原始响应对象并返回数据项迭代器或 None 的可调用对象. |
iter_items
async
iter_items(
limit: int | None = None,
) -> AsyncGenerator[ItemT_co, None]
执行单次请求并逐个产出提取的实体.
| PARAMETER | DESCRIPTION |
|---|---|
limit
|
最大提取条目数量. 如果为 None, 则提取所有返回的条目.
TYPE:
|
| YIELDS | DESCRIPTION |
|---|---|
AsyncGenerator[ItemT_co, None]
|
从响应中提取的数据项实体. |
Source code in qqmusic_api/core/pagination.py
PaginatedMixin
dataclass
PaginatedMixin(
*, pager_strategy: PagerStrategy[RequestResultT]
)
Bases: ABC, Generic[RequestResultT]
赋予翻页能力的混入类.
提供跨页请求的调度、状态管理及迭代能力. 宿主类需提供当前分页参数和生成新请求的能力.
| ATTRIBUTE | DESCRIPTION |
|---|---|
pager_strategy |
用于判断是否有下一页以及计算下一页参数的翻页策略对象.
TYPE:
|
next_request
根据上一次请求的响应, 构建下一次翻页的请求.
| PARAMETER | DESCRIPTION |
|---|---|
previous_response
|
上一次请求得到的解析后响应对象.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
Self | None
|
下一次请求的描述符, 如果没有更多数据则返回 None. |
Source code in qqmusic_api/core/pagination.py
pager
pager(
limit: int | None = None,
) -> AsyncPager[RequestResultT]
返回有状态异步分页器.
| PARAMETER | DESCRIPTION |
|---|---|
limit
|
最大可拉取页数限制. 如果为 None, 则无限制拉取直到结束.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
AsyncPager[RequestResultT]
|
管理当前请求翻页状态的异步分页器实例. |
collect
async
paginate
async
paginate(
limit: int | None = None,
) -> AsyncGenerator[RequestResultT, None]
返回响应的分页迭代器.
| PARAMETER | DESCRIPTION |
|---|---|
limit
|
最大可拉取页数限制. 如果为 None, 则无限制翻页.
TYPE:
|
| YIELDS | DESCRIPTION |
|---|---|
AsyncGenerator[RequestResultT, None]
|
单页的解析后响应对象. |
Source code in qqmusic_api/core/pagination.py
ItemPaginatedMixin
dataclass
ItemPaginatedMixin(
*,
items_extractor: Callable[
[RequestResultT], Iterable[ItemT_co] | None
],
pager_strategy: PagerStrategy[RequestResultT],
)
Bases: PaginatedMixin[RequestResultT], ItemMixin[RequestResultT, ItemT_co]
跨页提取数据项能力的混入类.
结合了 PaginatedMixin 的自动翻页与 ItemMixin 的数据提取能力, 提供平滑的跨页条目级流式拉取.
iter_items
async
iter_items(
limit: int | None = None,
) -> AsyncGenerator[ItemT_co, None]
跨页展开提取数据项的异步迭代器.
自动处理网络翻页, 并逐个产出提取的数据项. 达到指定条目数或所有页面拉取完毕时停止.
| PARAMETER | DESCRIPTION |
|---|---|
limit
|
最大提取的条目总数限制. 如果为 None, 则提取所有页面的所有条目.
TYPE:
|
| YIELDS | DESCRIPTION |
|---|---|
AsyncGenerator[ItemT_co, None]
|
提取的数据项实体. |