This module provides runtime support for type hints。
下面的函数接收与返回的都是字符串,注解方式如下:
def greeting(name: str) -> str: return name
greeting
函数中,参数 name
的类型是 str
,返回类型也是 str
。
其实是提示,并没有强制报错:不过有了类型注解,一些 IDE 是可以识别出来并提示的,比如 PyCharm 就可以识别出来在调用某个方法的时候参数类型不一致
复杂结构
对于一些结构的数据类型就不能用上述简单的方法表示了,比如:
names: list = ['lily', 'tom'] version: tuple = (6, 6, 6) operations: dict = {'sad': False, 'happy': True}
以上虽然定义了最外层的数据结构,如列表、元组、字典,但他们每个元素的类型是什么也没有定义清楚,因此需要在 typing 库的帮助下来定义准确内部的结构:
from typing import List, Tuple, Dict names: List[str] = ['lily', 'tom'] version: Tuple[int, int, int] = (6, 6, 6) # 仅有元祖类型支持,List不支持多个 List[int, int, int]汇报错 operations: Dict[str, bool] = {'sad': False, 'happy': True}
自定义:NewType
from typing import NewType UserId = NewType('UserId', int) some_id = UserId(524313)
Any
类型
Any
是一种特殊的类型。静态类型检查器认为所有类型均与 Any
兼容,同样,Any
也与所有类型兼容。
也就是说,可对 Any
类型的值执行任何操作或方法调用,并赋值给任意变量
标记没有返回值的函数的特殊类型
from typing import NoReturn def stop() -> NoReturn: raise RuntimeError('no way')
用于显式声明 类型别名 的特殊标注
from typing import TypeAlias Factors: TypeAlias = list[int]
name_list: Factors = [1,2,3,4]
元祖类型(支持[])
from typing import List, Tuple, Dict, NewType user: Tuple[str, int] = ('fanjiexiong', 27)
二选一类型
from typing import List, Tuple, Dict, NewType, Union user: Tuple[Union[str, int], int] = ('fanjiexiong', 27) user1: Tuple[Union[str, int], int] = (22, 27)
可选类型
from typing import Optional def foo(arg: Optional[int] = None) -> None: # arg为可选参数且仅为int型 return None print(foo()) print(foo(1)) print(foo('1'))
常见的几种嵌套类型:
列表¶
例如,让我们来定义一个由 str
组成的 list
变量。
从 typing
模块导入 List
(注意是大写的 L
):
from typing import List def process_items(items: List[str]): for item in items: print(item)
同样以冒号(:
)来声明这个变量。
输入 List
作为类型。
由于列表是带有"子类型"的类型,所以我们把子类型放在方括号中:
from typing import List def process_items(items: List[str]): for item in items: print(item)
这表示:"变量 items
是一个 list
,并且这个列表里的每一个元素都是 str
"。
这样,即使在处理列表中的元素时,你的编辑器也可以提供支持。
没有类型,几乎是不可能实现下面这样:
注意,变量 item
是列表 items
中的元素之一。
而且,编辑器仍然知道它是一个 str
,并为此提供了支持。
元组和集合¶
声明 tuple
和 set
的方法也是一样的:
from typing import Set, Tuple def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]): return items_t, items_s
这表示:
- 变量
items_t
是一个tuple
,其中的每个元素都是int
类型。 - 变量
items_s
是一个set
,其中的每个元素都是bytes
类型。
字典¶
定义 dict
时,需要传入两个子类型,用逗号进行分隔。
第一个子类型声明 dict
的所有键。
第二个子类型声明 dict
的所有值:
from typing import Dict def process_items(prices: Dict[str, float]): for item_name, item_price in prices.items(): print(item_name) print(item_price)
这表示:
- 变量
prices
是一个dict
:- 这个
dict
的所有键为str
类型(可以看作是字典内每个元素的名称)。 - 这个
dict
的所有值为float
类型(可以看作是字典内每个元素的价格)。
- 这个
参考文档:
- https://www.gairuo.com/p/python-type-annotations
- https://docs.python.org/zh-cn/3/library/typing.html