任意列表的Python类型注释?

时间:2018-07-16 23:59:09

标签: python types syntax type-hinting

我想注释一个函数的自变量,以表明期望将列表作为自变量。但是,我想保持列表的基本类型未指定。有没有办法做到这一点?即使用如下所示的占位符?

def my_func(li: List[any])

编辑是否可以使用模板:

类似于:

def union(li: List[List[T]])-> List[T]: 

1 个答案:

答案 0 :(得分:1)

  

但是,我想保持列表的基本类型未指定。有没有办法做到这一点?即使用如下所示的占位符?

def my_func(li: List[any])

是的。但是您想要Any

  

表示不受限制的特殊类型。

     
      
  • 每种类型都与Any兼容。
  •   
  • Any与每种类型兼容。
  •   

  

是否可以使用模板:

     

类似于:

def union(li: List[List[T]])-> List[T]: 

是的。尽管它们被称为generics,而不是模板(因为它们实际上不像提供Turing完整编译时语言的C ++模板那样,它们只是简单的泛型类型。

唯一的问题是泛型类型需要类型变量,并且没有名为T的内置类型变量。但是,创建一个很简单,如文档所示,T当然是常规的“第一个通用参数” typevar:

T = TypeVar('T')

…然后您可以使用它:

def union(li: List[List[T]])-> List[T]: 

如果您已经知道C ++模板或Haskell参数化类型或Java泛型或其他内容,那么可以尝试进入并开始编写Python类型注释,并假设您可以猜测它们的含义。但实际上,您至少需要阅读the docsPEP 483的前几节以及其他各种链接的PEP。否则,您将猜测各种错误(不仅调用Any以及如何声明TypeVar,而且还可能Tuple的参数是什么,如何协方差的工作原理,即从结构上检查泛型与名义上的通用类型等。


虽然我们正在这样做,除非您确实需要输入为List,否则您可能希望使用Sequence[Sequence[T]]Iterable[Sequence[T]]或类似名称。

您可以在Classes, functions, and decorators中找到所有详细信息,但总的来说,collections.abc中的任何内容似乎都应该在typing中具有通用的对应内容。