首页 > 解决方案 > 表示可以多次迭代的Iterable的pythonic方式是什么

问题描述

我想就用类型提示在 python 中表达以下函数的最 Pythonic 方式获得您的建议:

我想公开一个函数作为接受输入参数并返回输出的库的一部分。输入参数的约定应该是:

一个示例可能是一个函数,它接受一系列 URL,然后向这些 URL 发出请求,可能带有一些重试逻辑,因此我必须多次迭代原始序列。但我的问题比这个样本更笼统。

乍一看,一个合适的签名是:

from typing import Iterable

def do_sth(input: Iterable[str]) -> SomeResult:
  ...

然而,这违反了第三个要求,因为在 python 中,不能保证您可以多次迭代 Iterable,例如因为迭代器和生成器本身就是可迭代的。

另一种尝试可能是:

from typing import Sequence

def do_sth(input: Sequence[str]) -> SomeResult:
  ...

但是Sequence合同超出了我的功能所需,因为它包括索引访问以及长度的知识。

我想到的一个解决方案是使用Iterable签名,然后在内部复制输入。但是,如果源序列很大,这似乎会引入潜在的内存问题。

有没有解决方案,即python是否知道Iterable每次都会返回一个新迭代器的概念?

标签: pythonapi-designtype-hinting

解决方案


推荐阅读