typing
是python3.5
中开始新增的专用于类型注解(type hints)的模块,为python
程序提供静态类型检查注意Python 运行时不强制执行函数和变量类型注解,但这些注解可用于类型检查器、IDE、静态检查器等第三方工具。
typing常用类型
- int、long、float:整型、长整形、浮点型
- bool、str:布尔型、字符串类型
- List、 Tuple、 Dict、 Set:列表、元组、字典、集合
- Iterable、Iterator:可迭代类型、迭代器类型
- Generator:生成器类型
模块常用的类型有 Any, Union, Tuple, Callable, TypeVar,Optional和Generic等
简单的类型注解及其形式就如 Python Type Hint(类型标注/类型提示) (箭头 ->)(type annotation)_hxxjxw的博客-CSDN博客_python 箭头
是默认的
int、str
等简单类型也可以用自己自定义的类
class My(object): pass def get() -> My: return My() get()
举例
1. List, Tuple, Dict
from typing import List def func(a: int, string: str) -> List[int or str]: # 使用or关键字表示多种类型list1 = []list1.append(a)list1.append(string)return list1 if __name__ == '__main__':func(1, 'a')
from typing import List, Tuple, Dictdef add(a: int, string: str, f: float, b: bool) -> Tuple[List, Tuple, Dict, bool]:list1 = list(range(a))tup = (string, string, string)d = {"a": f}bl = breturn list1, tup, d, bl print(add(5, "hhhh", 2.3, False))
2. 别名 Type aliases
我们可以通过给类型赋予别名,简化类型注释,如下例中,毫无疑问,函数
broadcast_message2
的注解明显比broadcast_message
更加简洁清晰。from typing import Dict, Tuple, SequenceConnectionOptions = Dict[str, str] Address = Tuple[str, int] Server = Tuple[Address, ConnectionOptions]def broadcast_message(message: str, servers: Sequence[Server]) -> None:passdef broadcast_message2(message: str,servers: Sequence[Tuple[Tuple[str, int], Dict[str, str]]]) -> None:pass
3. NewType
可以使用
NewType
来创建一个用户自定义类型
NewType()
是一个辅助函数,用于向类型检查器指示不同的类型,在运行时,它返回一个函数,该函数返回其参数。from typing import NewTypeUserId = NewType('UserId', int)def name_by_id(user_id: UserId) -> str:print(user_id)UserId('user') # Fails type check num = UserId(5) # type: intname_by_id(42) # Fails type check name_by_id(UserId(42)) # OKprint(type(UserId(5)))
4. Callable 可调对象
Callable[[int], str] 是把(int)转为 str 的函数
from typing import Callabledef f(a: int) -> str:return str(a)def callback(a: int, func: Callable[[int], str]) -> str:return func(a)print(callback(1, f))
5. Union 或
让其返回值的类型可能是
int
,也可能是My
的实例。
Union
类型,表示 或例如下方的例子就是,
get
返回值的就是[My, int]
中的任意一个。from typing import Union class My(object): pass def get() -> Union[My, int]: return My()get()
在3.10版本后,支持更加精简的写法:
My | int
6. Any
静态类型检查器会将每种类型都视为与 Any 兼容,将 Any 视为与每种类型兼容
from typing import Anya = None # type: Any a1 = [] # OK a2 = 2 # OKs = '' # type: str s1 = a # OKdef foo(item: Any) -> int:# Typechecks; 'item' 可以是任意类型print(item)return 1foo(a) foo(a1) foo(a2) foo(s) foo(s1)
所以,所有没有返回类型或参数类型的函数将隐式默认使用 Any
def legacy_parser(text):...return data# 上述写法等价于下述写法def legacy_parser(text: Any) -> Any:...return data
7. Optional
可选类型
- Optional[int] 等价于 Union[int, None]
- 意味着:既可以传指定的类型 int,也可以传 None
Optional 和默认参数其实没啥实质上的区别,只是写法不同
使用 Optional 是为了让 IDE 识别到该参数有一个类型提示,可以传指定的类型和 None,且参数是可选非必传的
from typing import Optional def foo_func(arg: Optional[int] = None):print(arg)foo_func() foo_func(1)
使用默认参数的写法
def foo_func(arg: int = None):print(arg)foo_func() foo_func(1)
Python typing模块(类型标注)(type hints)(一) —— NewType Callable可调/回调 Union或 Any Optional
2023-09-25 6 0