目录
一、概述
1、描述
变量类型注解是用来对变量和函数的参数返回值类型做注解,让调用方减少类型方面的错误,也可以提高代码的可读性和易用性。
但是,变量类型注解语法传入的类型表述能力有限,不能说明复杂的类型组成情况,因此引用了typing模块,来实现复杂的类型表达。
2、常用的数据类型
3、mypy模块
二、使用
1、基本使用
from typing import List, Set, Dict, Tuple
#对于简单的 Python 内置类型,只需使用类型的名称
x1: int = 1
x2: float = 1.0
x3: bool = True
x4: str = "test"
x5: bytes = b"test"
# 对于 collections ,类型名称用大写字母表示,并且
# collections 内类型的名称在方括号中
x6: List[int] = [1]
x7: Set[int] = {6, 7}
#对于映射,需要键和值的类型
x8: Dict[str, float] = {'field': 2.0}
#对于固定大小的元祖,指定所有元素的类型
x9: Tuple[int, str, float] = (3, "yes", 7.5)
#对于可变大小的元祖,使用一种类型和省略号
x10: Tuple[int, ...] = (1, 2, 3)
'''在终端执行检查
(venv) D:\python>mypy .\01.py
Success: no issues found in 1 source file
'''
2、函数参数返回值添加类型标注
1. 指定多个参数的方式
'''
定义一个函数 参数 num int类型
返回值 字符串类型
使用mypy检测
'''
def num_fun(num: int) -> str:
return str(num)
num_fun(100)
print(num_fun(100))
# 指定多个参数的方式
def plus(num1: int, num2: int) -> int:
return num1 + num2
# 在类型注释后为参数添加默认值,默认值需要添加在末尾
'''
声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。
这是因为 Python 解释器需要确定参数传递的顺序,
如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个
'''
def func1(num1: int, my_float: float = 3.5)-> float:
return num1 + my_float
print(func1(10,20))
f = func1
print(f(10))
2. Callable
Callable
是一个抽象类,用于描述可调用对象的基本行为,例如函数、方法和类。当你声明一个函数变量并将其分配给一个变量时,这个变量只是一个普通的 Python 对象,并不是一个可调用对象,因此它没有默认值
带有默认值的参数可以放在任何位置,但是在声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。这是因为 Python 解释器需要确定参数传递的顺序,如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个。
from typing import Callable
#定义变量 指向一个函数
def func2(num1:int, my_float=3.5) -> str:
return f'返回结果{num1 + my_float}'
print(func2(10))
#Callable指向可调用(函数)值的方式
x: Callable[[int, float], str] = func2
print(x(10, 3.5))
'''
执行结果
返回结果13.5
返回结果13.5
'''
3. Iterator
#定义函数,产生整数的生成器,每次返回一个
from typing import Iterator
# 产生整数的生成器函数安全地返回只是一个 整数迭代器的函数
#,因此这就是我们对其进行注释的方式
def g(n: int) -> Iterator[int]:
i = 0
while i < n:
yield i #下次迭代时,代码从 yield 的下一条语句(不是下一行)开始执行
i += 1
print(g(10))
for i in g(10):
print(i)
'''执行结果
<generator object g at 0x00000000014E88E0>
0
1
2
3
4
5
6
7
8
9
'''
2、混合类型检查改进
1.联合运算符
联合运算符使用 " | " 线来替代了旧版本中Union[] 方法,使得程序更简洁
#新版本
def get_name(user: str | dict) -> str:
if isinstance(user, str):
return user
elif isinstance(user, dict):
return user.get('name', '')
print(get_name({'name':'Bob'}))
print(get_name("Alice"))
#旧版本,Union方法来实现相同的功能
from typing import Union
def get_name2(user: Union[str, dict]) -> str:
if isinstance(user, str):
return user
elif isinstance(user, dict):
return user.get('name', '')
print(get_name2({'name':'Bob'}))
print(get_name2("Alice"))
'''执行结果
Bob
Alice
'''
3、类型别名更改
#旧版本
oldname = str
def oldFunc(param:oldname) -> oldname:
return param + param
oldFunc('oldFunc:花非人陌')
#新版本,从3.10后开始支持
from typing import TypeAlias
newstr :TypeAlias = str #定义类型别名
newint :TypeAlias = int
def func_test(num:newint, msg:newstr)->newstr:
return str(num) + msg
print(func_test(100,"类型名称更改"))