类型注解是用于指明函数参数、返回值的数据类型,以提高代码的可读性和可维护性。
类型注解不会影响代码的运行,只是为第三方静态类型检查工具提供一种提示,提示函数接收什么类型的参数以及返回什么类型的参数。
Python是动态类型语言,变量和参数的类型不用提前声明,但是这在一定程度上降低了代码的可读性和增加了代码的调试难度。
future模块
"""
** future模块
future模块用于处理Python2和Python3之间的差异,通过future模块可以实现两种版本的迁移,
使用from __future__ import语句可以使Python2启用Python3的语法,反之依然。
** from __future__ import annotations语句
该语句用于在Python3.7及更早版本中启用类型注解,允许声明函数参数、返回值的类型。
在Python3.8及更高版本中,该语句不再是必要的,默认已启用该行为。如果编写代码用的Python3.8及更高的版本,而代码
可能在低版本的Python上运行,通过from __future__ import annotations来启用类型注解。
"""
from __future__ import annotations
def add(x: int, y: int = 6) -> int: # x为参数,int表明x的类型为int类;-> int表明返回值类型为int类
return x + y
typing模块
"""
typing模块提供了一些用于类型注解的特殊类型,并允许基于基本类型创建新的类型。
typing模块中的类型
Tuple:元组类型,声明元组中元素的种类
List:列表类型,声明列表中元素的种类
Dict:字典类型,声明键和值的种类
Set: 集合类型
Any: 任意类型
Union: 多个类型的联合
Callable: 可调用对象类型
"""
from typing import NewType, List, Tuple, Dict, Union
name: str = "Paul" # 基本类型直接注解
age: int = 16
ls: List[int] = [1, 2] # List只能接收一个参数
t: Tuple[int, float, str] = (1, 1.1, "Beijing") # Tuple可以接收多个参数
d: Dict[str, int] = {"a": 1}
# 定义函数时注解参数、返回值的类型
def get_grade(name: str) -> Tuple[str, float]:
grade = 95.6
return (name, grade)
def get_rank(name: str) -> Dict[str, Union[float, int]]:
grade = 95.6
rank = 1
return {name: (grade, rank)}
def get_name_list(cla: str) -> List[str]:
return ['Tim', 'Bob']
# int、str等类型所代指的内容非常宽泛,当需要更具体描述一些变量时,可以创建新类型
# typing模块的NewType用于根据已有类型创建一个新的类型,新的类型只是已有类型的一个别名, \
# 两者在类型上是等效的,但是别名更具有描述性,看到别名就知道变量的特性。
StudentId = NewType('StudentId', int) # 创建新类型StudentId
def get_info(id: StudentId) -> Dict[StudentId, str]:
return {id: 'Tim'}