class typing.List(list, MutableSequence[T])¶
Generic version of list. Useful for annotating return types. To annotate arguments it is preferred to use an abstract collection type such as Sequence or Iterable.
This type may be used as follows:
T = TypeVar('T', int, float)
def vec2(x: T, y: T) -> List[T]:
return [x, y]
def keep_positives(vector: Sequence[T]) -> List[T]:
return [item for item in vector if item > 0]
简单的类型注解
与目前其他语言一样,Python中的类型注解是直接在变量名后加上冒号和类型,如下所示:
上面我们定义了一个变量
n
,n
的类型注解为int
类型。稍复杂的类型注解
上面我们定义了一个
add
函数,其有两个int
类型参数,x
和y
。以及我们注解了这个函数的返回值也是int
类型。在交互模式的
help
函数中我们也可以看到关于函数的信息:较为复杂的类型注解
当我们需要限制符合类型如
list
中的元素时,我们就需要使用到typing
库了。typing.Tuple:
上面的示例中我们定义了一个
address
变量,并注解其由一个str
和一个int
构成。我们可以使用
Tuple[type1, type2, ...]
表示一个由type1
,type2
……等组成的元组。你也可以使用
Tuple[int, ...]
(字面值省略号)表示任意长度的int
类型元组,而当你仅需要一个空元组时则可以通过Tuple[()]
来定义。同理,你还可以
Tuple[Any, ...]
来注解一个不受限制的tuple
,理论上这与直接写成tuple
是等价的。或许你还可以参考下面的typing.TypeVar
使Tuple
变得更加适合你。typing.TypeVar
不适合用在元组里(mypy会报错)。typing.List:
此外我们还可以用
List
来限制一个列表中元素的类型。List[str]
表示只接受元素全为str
类型的列表。Python官网文档里的示例好像是实现支持多种类型的列表:注意:上面已经提过了,
TypeVar
定义的类型只适合用作注解函数,不然mypy会报错!typing.TypeVar:
文档里使用的
TypeVar
有点类似于TypeSctipt中的type
类型。定义后的类型不建议使用在注解变量时,mypy会报错。
typing.Literal: 用于限制一些参数的字面值。Python官网给的例子就很好:
这与TypeScript中的
type mode = 'r' | 'rb' | 'w' | 'wb'
有点类似。typing.Any:
兼容任何类型,略。
typing.Union:
有点类似于
TypeVar
,将多个类型联合为一个整体类型,如下所示:此特性在Python3.6.2加入,可以用来代替
TypeVar
注解变量。typing.NoReturn:
类似于TypeScript中的
never
关键字,用于修饰函数永远不会正确执行(即返回)。使用方法如下:typing.Type:
这个类型注解是最有意思的,因为它是支持协变的。何为协变?参考百度百科。
简而言之,如果有个类型叫做
T
,那么我们扩展以后的类型ET
就是Type[T]
类型。如下:你也可以理解为它是类型的类型。
其他类型注解:
仅以简写格式列出来其他一些常用类型注解:
typing.List[T]
typing.Dict[KT, VT]
(KT:key类型,VT:value类型)typing.Set[T]
typing.Iterable[T_co]
(T_co:元素类型,co应该是collection的缩写)配合mypy一起使用
为什么我们学会了类型注解仍需要mypy呢?
以最开始的
n: int
为例,按照逻辑来,我们现在可以将任意一个int
类型的值赋给n
,如n = 9
。但是实际上Python
并不真的对类型进行检查!若是此时将任意字符串赋给
n
,如n = '9'
,Python也不会跑出诸如TypeError
一样的异常!此外还需要注意与其他语言不同,Python中的类型注解没有初始化值!此时若是在REPL模式下操作,键入n回车后会报
NameError
错误:因此这里我们就需要使用到mypy来替我们检查了,通过命令
pip install mypy
即可安装。使用方法:
mypy <目录 或 文件>
Refs: