我希望能得到你的建议,关于在Python中使用类型提示表达以下函数的最佳方式:
我想将一个函数作为库的一部分来公开,该函数接受一个输入参数并返回一个输出。 输入参数的合约应为:
- 我的函数可以迭代它
- 如果我的函数维护对输入的引用(例如通过返回保留该引用的对象),那么这是可以的
- 可以多次迭代输入
一个示例可能是一个接受URL序列的函数,然后向这些URL发出请求,可能还会有一些重试逻辑,因此我需要多次迭代原始序列。 但是,我的问题比这个样本更通用。
乍一看,一个适当的签名将是:
from typing import Iterable
def do_sth(input: Iterable[str]) -> SomeResult:
...
然而这违反了第三个要求,因为在 Python 中不能保证您可以多次迭代一个可迭代对象,例如,因为迭代器和生成器本身也是可迭代的。
另一种尝试可能是:
from typing import Sequence
def do_sth(input: Sequence[str]) -> SomeResult:
...
但是Sequence
协议比我所需的函数更多,因为它包括索引访问和长度的知识。
我想到的一个解决方案是使用Iterable
签名,然后在内部复制输入。但是如果源序列很大,这似乎会引入潜在的内存问题。
是否有解决方法,即Python是否知道每次都会返回新迭代器的Iterable
的概念?
List[str]
,让调用者担心如何从可能不可迭代的值中创建一个列表即可。 - chepneritertools.cycle
:foo2 = cycle(foo)
内部缓存了foo
的元素,以便可以无限次地重复它们,但是foo
和foo2
不再是独立的;在一个上调用next
会消耗另一个上的项目。另一个例子是itertools.tee
;文档明确表示,在f1,f2 = tee(foo)
之后不能可靠地使用foo
;您必须使用f1
和f2
。 - chepnerTuple
,因为我希望它是不可变的。我对这种方法的困扰是,这将在接口中使用实现类而不是抽象类。 - Carsten