看到这段 Python 代码,我才发现之前的数据校验写得有多冗余.
写了好几年 Python,我一直觉得自己对数据校验这块还算熟练。每次写接口,我都会先把参数一个个拿出来,再用 if else 去判断类型、长度、范围。代码写出来很长,但自己觉得挺稳的。
直到有一天,我看到同事的一段代码。他只用了一行,就完成了我要写二十行才能搞定的事情。那一瞬间,我坐在电脑前说不出话。
他写的是 pydantic。
我的数据校验方式是这样的:先定义一个函数,然后对每个参数单独校验。比如要校验一个用户注册的请求,我写了一大堆 if 语句。先判断用户名是不是字符串,再判断长度够不够,接着判断邮箱格式对不对,最后还要检查密码强度。每一行都是重复的劳动。
同事的代码是这样写的:
from pydantic import BaseModel, Field, EmailStr
class UserRegister(BaseModel):
username: str = Field(min_length=3, max_length=20)
email: EmailStr
password: str = Field(min_length=8)
就这几行,我那些十几行的 if else 全都不需要了。他还加了个自动转换的功能,比如前端传了个字符串形式的数字 '123',pydantic 会自动把它转成整数 123。我以前要手动写 int() 加上 try except。
更让我脸红的还在后面。数据校验通过后,我需要把数据传到数据库。以前我要自己一个个字段拼接 SQL,或者构建 ORM 对象。他用 pydantic 的 model_dump 方法,一行代码就把校验过的数据变成了字典,直接扔给数据库操作。
我检查了之前写的代码,光是参数校验的部分,就有两百多行重复的 if else。同样的逻辑在不同的接口里复制粘贴了好多次。 每次改校验规则,要翻好几个文件改同一个地方。我不敢想象之前那些项目,如果团队其他人接手,面对一坨一坨的校验代码会是什么心情。
同事跟我说,pydantic 是 Python 的数据校验库,专门处理这种事情。 它使用类型注解,你定义好数据模型,库自动帮你做类型检查、范围校验、格式校验。错了会抛出清晰异常信息,对了就直接给你一个干净的数据对象。
我试着自己重构了一个旧接口。原来的校验代码有一百多行,改成 pydantic 模型后缩到了三十行。代码可读性提高了,维护也简单了。想加个字段,直接加一行注解就行。想改校验规则,改一个参数的事。
从那以后,我写新项目都默认用 pydantic 做数据校验。 之前那些手动写 if else 校验的日子,我回头看全是重复造轮子。Python 生态里有这么多好用的库,我当初为什么不早点学一下。
你要是也和我一样,还在手动写一堆 if else 做数据校验,去看看 pydantic 吧。不需要多大的学习成本,看看官方文档的十分钟快速入门,就能省下你后面无数个写重复代码的小时。
有时候我们太忙了,忙到没有时间去想怎么把代码写得更好。但停下来学一点更好的工具,反而能让工作更快。