Python 类型提示模块 typing 详解

发布时间:2026/8/25 17:17:26
Python 类型提示模块 typing 详解 文章目录1. 什么是 typing2. 基础用法1变量类型标注2函数类型标注3可选类型Optional4联合类型Union5任意类型Any3. 常用类型总结4. 高级用法简单提一下5. 学生成绩管理系统 Demo含 typing 标注1. 什么是typingtyping是 Python 的类型提示type hints库它不改变 Python 本身的动态特性但能让我们给变量、函数、类加上类型标注提高代码可读性帮助 IDE 和工具做静态检查提前发现 bug方便团队协作别人一眼就能看懂你函数需要什么类型、返回什么。 注意类型提示不会影响代码运行只是“标注”主要用来提示和检查。2. 基础用法1变量类型标注fromtypingimportList,Dict name:strAliceage:int18scores:List[int][95,88,76]info:Dict[str,int]{math:95,english:88}name: str→ 表示name是字符串age: int→ 表示age是整数scores: List[int]→ 表示scores是整数列表info: Dict[str, int]→ 表示info是 key 为字符串value 为整数的字典2函数类型标注fromtypingimportListdefadd(x:int,y:int)-int:returnxydefaverage(nums:List[int])-float:returnsum(nums)/len(nums)参数和返回值都可以标注- int表示返回值类型是整数- float表示返回值类型是浮点数3可选类型Optional有时候参数可以是某种类型也可以是NonefromtypingimportOptionaldefgreet(name:Optional[str])-str:ifname:returnfHello,{name}returnHello, stranger这里Optional[str]等价于Union[str, None]。4联合类型Union表示一个值可以是几种类型fromtypingimportUniondefsquare(x:Union[int,float])-float:returnx*xx可以是int或float。5任意类型Any如果你不确定类型可以用AnyfromtypingimportAnydefprocess(data:Any)-None:print(接收到:,data)Any就是“啥都行”。3. 常用类型总结类型含义List[int]整数列表Dict[str, float]键是字符串值是浮点数的字典Tuple[int, str]一个元组里面是(int, str)Set[str]字符串集合Optional[T]类型 T 或 NoneUnion[T1, T2]类型 T1 或 T2Any任意类型Callable[[T1, T2], R]一个函数参数是 T1/T2返回值是 R示例fromtypingimportTuple,Set,Callabledefget_point()-Tuple[int,int]:return(3,5)defunique_names()-Set[str]:return{Alice,Bob}defoperate(func:Callable[[int,int],int],x:int,y:int)-int:returnfunc(x,y)4. 高级用法简单提一下TypedDict可以给字典定义固定结构Literal限制值只能是几个固定的常量Protocol接口风格的类型检查鸭子类型这些在大型项目中更常用新手可以先跳过。5. 学生成绩管理系统 Demo含 typing 标注fromtypingimportList,Dict,Optional,Tuple# 学生成绩类型课程 - 分数ScoresDict[str,float]# 学生类型classStudent:def__init__(self,name:str,age:int,scores:Optional[Scores]None)-None:self.name:strname self.age:intage self.scores:Scoresscoresor{}defadd_score(self,subject:str,score:float)-None:添加或更新成绩self.scores[subject]scoredefget_average(self)-Optional[float]:计算平均分ifnotself.scores:returnNonereturnsum(self.scores.values())/len(self.scores)def__repr__(self)-str:returnfStudent(name{self.name}, age{self.age}, scores{self.scores})# 成绩管理系统classGradeSystem:def__init__(self)-None:self.students:List[Student][]defadd_student(self,student:Student)-None:添加学生self.students.append(student)deffind_student(self,name:str)-Optional[Student]:按名字查找学生forsinself.students:ifs.namename:returnsreturnNonedefget_top_student(self)-Optional[Tuple[str,float]]:获取平均分最高的学生 (名字, 平均分)ifnotself.students:returnNonetopmax(self.students,keylambdas:s.get_average()or0.0)return(top.name,top.get_average()or0.0)# 使用示例if__name____main__:# 初始化系统systemGradeSystem()# 添加学生aliceStudent(Alice,18)bobStudent(Bob,19)system.add_student(alice)system.add_student(bob)# 添加成绩alice.add_score(math,95)alice.add_score(english,88)bob.add_score(math,76)bob.add_score(english,82)bob.add_score(physics,90)# 查询学生stusystem.find_student(Alice)print(找到学生:,stu)# 平均分print(Alice 平均分:,stu.get_average()ifstuelseNone)# 最强学霸topsystem.get_top_student()print(学霸是:,top) 运行结果示例找到学生: Student(nameAlice, age18, scores{math: 95, english: 88}) Alice 平均分: 91.5 学霸是: (Bob, 82.66666666666667) 这里的typing用法Scores Dict[str, float]→ 定义别名更清晰表达“课程 - 分数”。Optional[float]→ 平均分可能不存在没成绩时返回None。List[Student]→ 学生列表。Tuple[str, float]→ 返回(名字, 平均分)的组合。 感谢阅读想了解更多 我的博客网站 | 记录思考分享干货 我的个人主页 | 关于我、开源项目