由于python是个动态类型语言,变量是什么类型是在变量运行的时候决定的,与他人合作或者代码躲多起来之后会变得难以阅读与调试,python3.5以上引入了type hint(类型提示)
举个例子 比如有一个专门计算整型的加法函数如下
def add(a,b):
return a+b
add(1,2)
光看这个add函数我们并不知道函数的参数类型和返回值类型是啥
但是使用type hint 之后
def add(a:int,b:int)->int:
return a+b
这样做有几个好处
函数作者和调用者一眼能看出是什么参数类型和返回值类型

输入错误的类型之后,ide会高亮显示提醒作者输入的类型错误
如下图所示

def my_sum(d: dict[str, int]) -> int:
total = 0
for i in d.values():
total += i
return total
my_sum({"a": 2, "b": 3})
使用如下
class Test:
name = "phil"
def get_name(a: Test) -> str:
return a.name
print(get_name(Test()))
如果在get_name函数中传Test就会报错
get_name(Test)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CqBCrzXs-1659080348075)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1658999352457.png)]](https://1000bd.com/contentImg/2022/08/01/134843929.png)
意思是期望传一个 类型为Test的参数,现在得到一个类型为Test
解释一下:比如传一个int类型的参数为3,现在直接传的是 int
这是一个求列表内元素总和的函数 在入参[1, 2, “3”]加入了个str 这样是不能求和的 但是没有任何提示
def my_sum(my_list: list)->int:
sum = 0
for i in my_list:
sum += i
return sum
print(sum([1, 2, "3"]))
无提示 如下图 因为只检查了最外层是list没有检查内层的每个元素

这样写就可以了

但是还是没有提示 可以安装三方库 mypy ,然后使用mypy xx.py进行静态检查

想传list也想传tuple 可以使用Sequence 支持列表,元组,字节,range
from typing import Sequence
def my_sum(my_list: Sequence[int]) -> int:
total = 0
for i in my_list:
total += i
return total
my_sum([1, 2, 3])
my_sum((1, 2, 3))
my_sum(b"123")
my_sum(range(3))
如果一个参数有可能传int也有可能传None,那么可以使用union
from typing import Union
def func(a: Union[int, None]):
if a is None:
return 0
return a
func(None)
func(1)
也可以使用Optional是一样的效果
from typing import Optional
def func(a: Optional[int]):
if a is None:
return 0
return a
func(None)
func(1)
必须就得是这个样子 规定输入什么 就得输入什么
from typing import Literal
class Person:
def __init__(self, name, gender: Literal["male", "female"]):
self.name = name
self.gender = gender
b = Person("phil", "male")
a = Person("phil", "男")
如果在实例化的时候输入 a = Person(“phil”, “男”) 就会有如下提示

noreturn是真的没有返回值,如报错了
from typing import NoReturn
def error() -> NoReturn:
raise KeyError
目前默认的就是Any,什么类型都可以 如果确认返回的不是None但是没有想好返回什么类型就是用Any
from typing import Any
def fun(a) -> Any:
pass