当前位置: 首页 > news >正文

pydantic - 更方便地编写 entity 类

什么是pydantic

Pydantic 是一个 Python 库,专门用于数据验证和配置管理,它使用 Python 类型注解来定义数据结构。你可以把它看作是一种方式,确保你的应用程序接收到的数据符合预期的格式和类型。

Pydantic 的核心思想是:你创建一个 Python 类,其中每个属性都带有类型注解(例如 int, str, list[int])。Pydantic 会根据这些注解自动生成验证逻辑。当你创建一个类的实例时,Pydantic 会检查传入的数据是否符合定义的类型和约束。如果不符合,它会抛出一个 ValidationError,告诉你哪些地方出了问题。

简单来讲, pydantic 帮助我们更方便和规范地编写entity类

python 原生编写entity类的例子

我们写一个User类的例子:

import src.configs.config
from loguru import loggerclass User1:def __init__(self, id: int, name:str ="No Name", email:str|None = None, friends:list[int]=[]):self.id = idself.name = name                                                                                                                                                                                                                                    self.email = emailself.friends = friends# getter
@property
def email(self):return self._email# setter
@email.setter
def email(self, value):if "@" not in value:raise ValueError("Email must contain an '@' symbol.")self._email = valueif __name__ == "__main__":alice = User1(1, "Alice","alice.he@5mi.com")logger.info(alice.__dict__)try:bob = User1( 3, "Bob","bobafk.com",[]) # didn' triggerred validationexcept ValueError as e:logger.info("ValueError occurred")logger.error(e)  

可以看出若干不方便的地方:

  1. 参数的类型和名字分开编写 , 不太直观
  2. 额外地编写getter 和setter
  3. 属性校验写在setter 中, 未能被构造函数触发

使用pydantic 的例子:

import src.configs.config
from loguru import logger
from pydantic import BaseModel, field_validatorclass User2(BaseModel):id: intname: str = "No name"email: str | None= Nonefriends: list[int]=[]@field_validator("email")@classmethoddef validate_email(cls, email: str):logger.info(f"Validating email: {email}")if "@" not in email:raise ValueError("Email must contain an '@' symbol.")return emailif __name__ == "__main__":# must be with attribute name, and it don't need to define the constructor __init__()user = User2(id=1, name="Mike", email="mike@usa.com", friends=[])user.name="Jay" # we don't need the setter and getter!logger.info(f"user name: {user.name}")try:danny = User2(id=2,name="Danny",email="dannyeu.com",friends=[])except ValueError as e:logger.info("ValueError occurred")logger.error(e)

优点很明显:

  1. 属性的定义和类型写在一起, 可读性更高
  2. 不需要手动写getter和setter, 但该类仍有setter和getter的功能。
  3. 属性校验有专门的方法, 更加规范,能被构造函数触发
http://www.dtcms.com/a/312313.html

相关文章:

  • [LeetCode优选算法专题一双指针——有效三角形的个数]
  • Vue+SpringBoot+langchain4j实战案例:实现AI消息问答 及 Markdown打字机渲染效果
  • CVE-2025-5947 漏洞场景剖析
  • ⭐CVPR2025 FreeUV:无真值 3D 人脸纹理重建框架
  • winntsetup安装驱动和光驱安装F6功能一样----NT5.2.3790源代码分析
  • 嵌入式硬件篇---Openmv
  • 若没有安全可靠性保障,对于工程应用而言,AI或许就是大玩具吗?
  • 13.Redis 的级联复制
  • 计算机网络:如何在实际网络中进行子网划分
  • nestjs @Get 从入门到精通
  • 选择排序原理与C语言实现详解
  • Python 小数据池(Small Object Pool)详解
  • golang的包和闭包
  • 【Linux】linux基础开发工具(三) 版本控制器Git、调试器 - gdb/cgdb使用、一些实用的调试技巧
  • Libevent(5)之使用教程(4)工具
  • 二叉树的锯齿形层次遍历
  • 日语学习-日语知识点小记-进阶-JLPT-真题训练-N1阶段(2):018年7月-JLPT-N1
  • TI 毫米波雷达开发:(四)毫米波雷达板开发所需软件
  • 记一次v-if和key错误使用,导致vue2的内存爆炸修复!
  • 著作权登记遇难题:创作者如何突破确权困境?
  • 【论文阅读|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】
  • 字节-面试
  • 性能测试工具ApacheBench、Jmeter
  • gitee使用教程
  • 昇思学习营-开发版-模型推理和性能优化
  • 在 Elasticsearch 中使用 LTR 参与检索
  • k8s+isulad 国产化技术栈云原生技术栈搭建3-master节点安装
  • 查找位置函数
  • 垃圾收集器G1ZGC详解
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 77-1(题目+回答)