python是动态语言,不用声明类型
# 不使用类型提示
def func(a,b):
return a+b
func('1','1') # '11'
func(1,1) # 2
func('1',1) # 未使用类型提示,代码编辑时不会报错,代码执行时会报错
# 使用类型提示
from typing import overload
@overload
def func(a: int, b: int): pass
@overload
def func(a: str, b: str): pass
def func(a, b):
return a + b
func(1, '1') # 使用类型提示,在代码编辑时就会报错,可以在代码执行前预防可能出现的问题
type hint
提示类型并不是可用类型,如typing.List并不是list的子类,typing.List只是一个type hint,对a参数指定一个type hint,这个type hint会被设置为func方法a入参的type hint属性,执行代码不会其任何作用,但是执行代码过程中可以获取到这个type hint属性,并使用它做一些处理
常见type hint
- List是list的泛型(泛型:表示某种类型)
- Tuple是tuple的泛型
- NamedTuple是collections.namedtupe的泛型
- Dict是dict的泛型
- Mapping是collections.Mapping的泛型
- Set是set的泛型
- Sequence是collection.Sequence的泛型/tuple+list的泛型
- NoReturn是无返回的泛型
- Any是任意类型的泛型
- TypeVar,可以创建泛型变量,就是传什么泛型就是什么泛型(
T = TypeVar('T')
) - NewType,一个新的泛型,
List=NewType('List', list)``Person=NewType('Person', int, int)
- Callable是可调用类型的泛型
- Union是联合类型
- Optional是可为空的联合类型
- Generator是一个生成器类型
每个实际类型都可以声明一个对应的泛型,可以使用实际了类型做type hint,所以很多时候都是直接用实际类型做typehint