类型暗示非生成器(非消耗性)可迭代

Mat*_* M. 9 types type-hinting python-3.x

我想输入提示这样的函数:

from types import Iterable

def func(thing: Iterable[str]) -> None:
    for i in range(10):
        for x in thing:
            do_thing(x)
Run Code Online (Sandbox Code Playgroud)

PyCharm 将(正确地)让我摆脱向此函数传递生成器的麻烦,但我想以一种它不允许我这样做的方式输入提示,同时仍然接受其他可迭代对象。

使用Sequence[str]不是一个选项,像 KeyView 这样的可迭代对象不是序列,但我仍然希望能够包含它们。

有人提到使用 aUnionSequence+ KeyView,这可以工作,但我想知道是否有更优雅和通用的解决方案

当然,无论如何我都可以转换thing为 a ,但我宁愿正确地暗示这个函数类型。list

使用Python 3.7

Fel*_*arz 2

不幸的是,我认为这对于 Python 的类型系统来说是不可能的。

直接来自 Guido(来源):

我们的类型系统不允许你表达这一点——这就像要求除猫之外的任何动物一样。在类型系统中添加这样的“例外”子句将是一项非常困难的操作。

由于没有解决方案,我将把它关闭为“无法修复”。

他的建议

是的,实用的解决方案是序列|集|映射。所需的否定还需要数年时间。