news 2026/1/11 18:16:39

typing和dataclass

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
typing和dataclass

typing模块里常用的类型注解工具,和 Python 3.9+ 原生类型的对应关系及用法如下,刚好能匹配你之前的答题系统场景:

typing类型Python 3.9+ 原生写法作用说明示例
List[T]list[T]标注元素类型为 T 的列表answers: list[SingleAnswer]
Dict[K, V]dict[K, V]标注键类型 K、值类型 V 的字典score: dict[str, int]
Tuple[T1, T2]tuple[T1, T2]标注固定长度和类型的元组q_and_a: tuple[int, str]
Set[T]set[T]标注元素类型为 T 的集合options: set[str]
Optional[T]`TNone`标注变量可以是 T 类型或 None`remark: strNone = None`
Union[T1, T2]`T1T2`标注变量可以是 T1 或 T2 类型`value: intstr`
Literal[val1, val2]Literal[val1, val2]标注变量只能是 val1、val2 等值option: Literal["A", "B", "C", "D"]
Callable[[ArgT], RetT]Callable[[ArgT], RetT]标注函数类型(参数类型 + 返回值类型)func: Callable[[int], bool]

补充说明

  1. Python 3.9 是个分水岭,之后可以直接用原生的list/dict代替List/Dict,但Literal/Callable这类特殊类型还是要从typing导入(Python 3.10+ 可从typingtypes导入)。
  2. 这些类型注解不影响代码运行,主要是给 IDE 做提示、给开发者看,搭配 Pydantic 时还能用来做数据校验。
# 导入dataclass装饰器 from dataclasses import dataclass # ==================== 普通 class 写法 ==================== class CommonProduct: """普通类,需要手动实现 __init__、__repr__、__eq__ 等魔法方法""" # 1. 手动写初始化方法,接收参数并赋值给实例属性 def __init__(self, name: str, price: float, stock: int): self.name = name self.price = price self.stock = stock # 2. 手动写 __repr__ 方法,控制实例打印时的输出格式(方便调试) def __repr__(self): return f"CommonProduct(name='{self.name}', price={self.price}, stock={self.stock})" # 3. 手动写 __eq__ 方法,定义两个实例的相等判断规则 def __eq__(self, other): # 先判断 other 是否是 CommonProduct 类型 if not isinstance(other, CommonProduct): return False # 当 name、price、stock 都相同时,两个实例才相等 return (self.name == other.name and self.price == other.price and self.stock == other.stock) # ==================== dataclass 写法 ==================== @dataclass # 装饰器自动生成 __init__、__repr__、__eq__ 等方法 class DataProduct: """dataclass 写法,无需手动编写魔法方法,只需定义字段和类型注解""" name: str # 商品名称 price: float # 商品价格 stock: int # 商品库存 # ==================== 测试对比 ==================== if __name__ == "__main__": # 1. 测试普通类 p1 = CommonProduct("T恤", 59.9, 100) p2 = CommonProduct("T恤", 59.9, 100) print("普通类实例打印:", p1) # 调用 __repr__ print("普通类实例相等判断:", p1 == p2) # 调用 __eq__,输出 True print("-" * 50) # 2. 测试 dataclass dp1 = DataProduct("牛仔裤", 129.9, 50) dp2 = DataProduct("牛仔裤", 129.9, 50) print("dataclass实例打印:", dp1) # 自动生成的 __repr__ print("dataclass实例相等判断:", dp1 == dp2) # 自动生成的 __eq__,输出 True

eq它的本质就是比对两个类的值是否相等,当然了只能比对整体,不能单个比对 就算一个不相等,它也是返回false repr它是默认会打印出你传入参数值 方便调试 dataclss会自动创建省得你手动 而且只要是传参的类都建议用dataclass 这样省去写__init__ repr就算地址不同 但是值相同就是一致的 但是他的只是属于类型提示 并不能校验 并不会报错 对于后端写api的建议使用pydantic他会校验传入的值 如果类型不对会进行报错

from pydantic import BaseModel, Field, ValidationError from typing import Literal # 方法1:用Literal直接限定只能是A、B、C、D class SingleAnswer(BaseModel): question_id: int option: Literal["A", "B", "C", "D"] # 只能选这四个选项 # 方法2:用正则表达式校验(适合更灵活的情况,比如允许小写a-d) class SingleAnswerWithRegex(BaseModel): question_id: int option: str = Field(pattern=r"^[A-Da-d]$") # 正则匹配A-D或a-d # 测试正确的情况 correct_ans = SingleAnswer(question_id=1, option="A") print(correct_ans) # 正常输出 # 测试错误的情况(选项为E) try: wrong_ans = SingleAnswer(question_id=2, option="E") except ValidationError as e: print(e) # 会提示选项必须是A、B、C、D中的一个
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/11 18:34:39

云工作负载防护新标准,如何用AZ-500实现Agent级零信任?

第一章:云工作负载防护新标准下的安全挑战随着企业加速向多云和混合云环境迁移,传统边界防御模型已无法满足现代应用架构的安全需求。云工作负载的动态性、短暂性和分布式特性,使得攻击面显著扩大,防护策略必须从静态规则转向自适…

作者头像 李华
网站建设 2026/1/10 19:59:24

微信 SDK、NCF 版本更新,更多更新日志,欢迎解锁

✍️优化 TenPayV3 模块 Senparc.Weixin SDK 1. Sample 版本更新 1.1 Sample v10.0.0.20251120 1.2 示例项目同步更新到新版本 ✍️问题修复 1. 微信支持修复 1.1 修复 TenPayNotifyHandler 中 Body 赋值问题,这是对微信支付通知处理器的关键修复 ✍️文档…

作者头像 李华
网站建设 2025/12/31 10:30:27

强力指南:快速掌握DuiLib_Ultimate的完整教程

强力指南:快速掌握DuiLib_Ultimate的完整教程 【免费下载链接】DuiLib_Ultimate DuiLib_Ultimate 是深耕 Windows 软件UI开发的利器, 以轻量化、高性能、易扩展 为核心,专为 Windows 平台打造极致桌面应用体验而生。 项目地址: https://git…

作者头像 李华
网站建设 2026/1/4 23:59:48

智能体(AI Agent)对投标领域的影响

在日益激烈的市场竞争中,投标是蔓延科技和所有企业获取项目、扩大业务的关键环节。传统投标过程涉及海量信息处理、复杂决策制定和紧张的时限压力,任何一个环节的疏漏都可能导致失败。近年来,人工智能技术的突破,特别是智能体&…

作者头像 李华
网站建设 2025/12/20 7:17:13

3分钟搞定前端图片裁剪:Cropper.js让图像处理变得如此简单

3分钟搞定前端图片裁剪:Cropper.js让图像处理变得如此简单 【免费下载链接】cropperjs JavaScript image cropper. 项目地址: https://gitcode.com/gh_mirrors/cr/cropperjs 还在为网站头像上传、图片编辑功能发愁吗?🤔 今天给大家推荐…

作者头像 李华
网站建设 2026/1/3 21:18:07

Wan2.2-T2V-A14B角色动作自然度评测:行走、奔跑、转身全解析

Wan2.2-T2V-A14B角色动作自然度评测:行走、奔跑、转身全解析 在影视预演的会议室里,导演正皱眉盯着一段粗糙的动画分镜——主角“走进房间”的动作看起来像滑行,转身时脖子像是断了。😅 这种“AI感”十足的画面,正是当…

作者头像 李华