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 logger

class User1:
    def __init__(self, id: int, name:str ="No Name", 
                 email:str|None = None, friends:list[int]=[]):
        self.id = id
        self.name = name                                                                                                                                                                                                                                    
        self.email = email
        self.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 = value


if __name__ == "__main__":
    alice = User1(1, "Alice","alice.he@5mi.com")
    
    logger.info(alice.__dict__)
    try:
        bob = User1( 3, "Bob","bobafk.com",[]) # didn' triggerred validation
    except 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_validator

class User2(BaseModel):
    id: int
    name: str = "No name"
    email: str | None= None
    friends: list[int]=[]

    @field_validator("email")
    @classmethod
    def validate_email(cls, email: str):
        logger.info(f"Validating email: {email}")
        if "@" not in email:
            raise ValueError("Email must contain an '@' symbol.")
        return email
    
if __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. 属性校验有专门的方法, 更加规范,能被构造函数触发

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值