【一】基本类型注解
【1】基础语法
-
定一个函数,参数名和返回值都有类型提示
-
参数类型就是弱约束,函数返回值也是弱约束(意思就是也可以不遵守类型)
def process_example(参数名: 参数类型) -> 返回值类型:
代码块
return 返回值
翻译:process_example(流程示例)
【2】内置类型
-
typing模块中提供了与Python内置类型相对应的类型提示,如:
-
int
,float
,str
,bool
,bytes
,complex
-
(1)整数类型
# 定义一个名为process_int的函数,接收一个整型参数data,并无返回值(None)
# 函数作用:打印传入数据data的值及其类型
def process_int(data: int) -> None:
print(f"the data is {data} and the type is {type(data)}")
(2)浮点数类型
# 定义一个名为process_float的函数,接收一个浮点型参数data,并无返回值(None)
# 函数作用:打印传入数据data的值及其类型
def process_float(data: float) -> None:
print(f"the data is {data} and the type is {type(data)}")
(3)字符串类型
# 定义一个名为process_str的函数,接收一个字符串型参数data,并无返回值(None)
# 函数作用:打印传入数据data的值及其类型
def process_str(data: str) -> None:
print(f"the data is {data} and the type is {type(data)}")
(4)布尔类型
# 定义一个名为process_bool的函数,接收一个布尔型参数data,并无返回值(None)
# 函数作用:打印传入数据data的值及其类型
def process_bool(data: bool) -> None:
print(f"the data is {data} and the type is {type(data)}")
【3】类型别名
-
typing模块中有多种内置的类型别名
-
比如
List
、Tuple
、Dict
、Set
、Frozenset
等,可以用于注解变量和函数的预期类型。
(1)列表类型
# 导入List类型模块以支持类型注解
from typing import List
# 定义一个名为process_numbers的函数,接收一个整数列表(List[int])类型的参数data,并无返回值(None)
# 函数作用:打印传入数据data是一个整数列表,以及列表中的每个元素都是整数类型,同时输出数据本身
def process_numbers(data: List[int]) -> None:
print(f'this is a number list , the data is {data} , every item is int and the type is {type(data)}')
(2)字典类型
# 导入Dict类型模块以支持类型注解
from typing import Dict
# 定义一个名为process_dict的函数,接收一个字典(Dict[str, int])类型的参数data,其中键为字符串(str),值为整数(int),并无返回值(None)
# 函数作用:打印传入数据data是一个字典,键为字符串类型,值为整数类型,同时输出数据本身
def process_dict(data: Dict[str, int]) -> None:
print(f"this is a dict, the data is {data} , the key is str , the value is int")
(3)元组类型
# 导入Tuple类型模块以支持类型注解
from typing import Tuple
# 定义一个名为process_tuple的函数,接收一个元组(Tuple[str])类型的参数data,其中元素为字符串(str),并无返回值(None)
# 函数作用:打印传入数据data是一个元组,所有元素均为字符串类型,同时输出数据本身
def process_tuple(data: Tuple[str]) -> None:
print(f"this is a tuple, the data is {data} , the item is str")
(4)集合类型
# 导入Set类型模块以支持类型注解
from typing import Set
# 定义一个名为process_set的函数,接收一个集合(Set[int])类型的参数data,其中元素为整数(int),并无返回值(None)
# 函数作用:打印传入数据data是一个集合,所有元素均为整数类型,同时输出数据本身
def process_set(data: Set[int]) -> None:
print(f"this is a set, the data is {data} , the item is int")
【4】Any(表示任意类型)
-
用于无法确定具体类型或允许返回任意类型
# 导入Any类型模块以支持类型注解,Any表示允许任何类型的数据
from typing import Any
# 定义一个名为process_any_data的函数,接收一个Any类型的参数data,表示该参数可以是任何类型的数据
# 函数没有返回值,声明为None
def process_any_data(data: Any) -> None:
# 使用f-string格式化输出,打印一条信息,内容为:"this is a data can be any type: {data}"
# 其中"data"处会被实际传入的data变量的值替换
print(f"this is a data can be any type: {data}")
【5】Union类型(允许接收多种不同类型的数据)
# 导入Union类型模块以支持类型注解
# Union允许函数接收多种类型作为参数或返回值
from typing import Union
# 定义一个名为double_or_square的函数,接收一个联合类型(Union[int, float])的参数number,可以是整数(int)或浮点数(float)
# 函数返回值也为联合类型(Union[int, float]),即返回结果可能是整数或浮点数
def double_or_square(number: Union[int, float]) -> Union[int, float]:
# 使用isinstance()函数检查传入的number参数是否为整数类型(int)
if isinstance(number, int):
# 如果number是整数,则将其乘以2并返回结果
return number * 2
# 否则,认为number为浮点数(else分支对应非int类型,这里假设只能是float)
else:
# 将number取平方(计算其二次幂)并返回结果
return number ** 2
【6】Optional类型(参数可以是指定类型或者None
)
# 导入Optional类型模块以支持类型注解
# Optional[str]表示字符串类型或None
from typing import Optional
# 定义一个名为greet的函数,接收一个Optional[str]类型的参数name,表示该参数可以是字符串类型或None
# 函数返回一个str类型的结果
def greet(name: Optional[str]) -> str:
# 如果传入的name参数非空(即存在有效值)
if name:
# 使用f-string格式化输出,返回一条问候语,内容为:"Hello, {name}!"
# 其中{name}处会被实际传入的name变量的值替换
return f"Hello, {name}!"
# 否则,当name参数为空(None)时
else:
# 返回默认问候语:"Hello, World!"
return "Hello, World!"
【二】总结
-
typing
模块为Python添加了静态类型注解的能力,提高了代码的可读性和维护性。 -
本文介绍了类型注解的基本概念、常见类型和高级类型,以及类型检查工具的使用。
-
希望读者可以更好地应用类型注解,改善Python代码的质量。