32

假设我有一个接受 a Garthok、 an Iterable[Garthok]、 anIterable[Iterable[Garthok]]等的函数。

def narfle_the_garthoks(arg):
  if isinstance(arg, Iterable):
    for value in arg:
       narfle_the_garthoks(arg)
  else:
    arg.narfle()

有没有办法为 arg 指定一个类型提示,表明它接受任何级别的Iterables Garthok?我怀疑不是,但我想我会检查我是否遗漏了什么。

作为一种解决方法,我只是指定了几个级别,然后以Iterable[Any].

Union[Garthok,
    Iterable[Union[Garthok,
        Iterable[Union[Garthok, 
            Iterable[Union[Garthok, Iterable[Any]]]]]]]]
4

1 回答 1

43

您可以使用类型别名前向引用字符串来指定类型语言中的递归类型,

Garthoks = Union[Garthok, Iterable['Garthoks']]

请注意,mypy 尚不支持递归类型。但它最终可能会被添加。


2020/9/14 更新:Microsoft 宣布在 Pyright/Pylance 中支持递归类型。


某些类型的前向引用由PEP0563处理。你可以从 Python 3.7 开始使用它们,方法是从__future__ import annotations– Konstantin

于 2018-12-19T05:28:15.300 回答