我想注释一个函数的自变量,以表明期望将列表作为自变量。但是,我想保持列表的基本类型未指定。有没有办法做到这一点?即使用如下所示的占位符?
def my_func(li: List[any])
编辑是否可以使用模板:
类似于:
def union(li: List[List[T]])-> List[T]:
答案 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 docs或PEP 483的前几节以及其他各种链接的PEP。否则,您将猜测各种错误(不仅调用Any
以及如何声明TypeVar
,而且还可能Tuple
的参数是什么,如何协方差的工作原理,即从结构上检查泛型与名义上的通用类型等。
虽然我们正在这样做,除非您确实需要输入为List
,否则您可能希望使用Sequence[Sequence[T]]
或Iterable[Sequence[T]]
或类似名称。
您可以在Classes, functions, and decorators中找到所有详细信息,但总的来说,collections.abc
中的任何内容似乎都应该在typing
中具有通用的对应内容。