【发布时间】:2018-12-24 13:42:46
【问题描述】:
我想对函数的参数进行注释,以指示列表应作为参数。但是,我想保持未指定列表的基本类型。有没有办法做到这一点?即使用如下的占位符?
def my_func(li: List[any])
编辑是否可以使用模板:
比如:
def union(li: List[List[T]])-> List[T]:
【问题讨论】:
标签: python types syntax type-hinting
我想对函数的参数进行注释,以指示列表应作为参数。但是,我想保持未指定列表的基本类型。有没有办法做到这一点?即使用如下的占位符?
def my_func(li: List[any])
编辑是否可以使用模板:
比如:
def union(li: List[List[T]])-> List[T]:
【问题讨论】:
标签: python types syntax type-hinting
但是我想保持未指定列表的基本类型。有没有办法做到这一点?即使用如下占位符?
def my_func(li: List[any])
是的。但是你想要Any:
表示无约束类型的特殊类型。
- 每种类型都与
Any兼容。Any兼容所有类型。
是否可以使用模板:
比如:
def union(li: List[List[T]])-> List[T]:
是的。尽管它们被称为generics,而不是模板(因为它们实际上不像提供图灵完备的编译时语言的 C++ 模板,它们只是简单的泛型类型。
唯一的问题是泛型类型需要类型变量,并且没有名为T 的内置类型变量。但是创建一个很容易,如文档中所示,当然T 是传统的“第一个泛型参数”类型变量:
T = TypeVar('T')
……然后你就可以使用它了:
def union(li: List[List[T]])-> List[T]:
如果您已经了解 C++ 模板或 Haskell 参数化类型或 Java 泛型或其他任何东西,那么假设您可以猜到它们的含义,那么很容易跳入并开始编写 Python 类型注释。但实际上,您至少需要阅读 the docs 或 PEP 483 的前几节以及其他各种相关的 PEP。否则,你会猜出各种各样的错误(不仅仅是Any被调用以及如何声明TypeVars,还可能Tuple的参数是什么,协方差如何工作,哪些泛型类型在结构上与名义上进行检查,等等。
当我们这样做时,除非您确实需要输入为 List,否则您可能需要 Sequence[Sequence[T]] 或 Iterable[Sequence[T]] 或类似名称。
您可以在 Classes, functions, and decorators 中找到所有详细信息,但一般来说,来自 collections.abc 的任何内容似乎应该在 typing 中具有通用对应项。
【讨论】: