数据验证库pydantic的用法
数据验证库pydantic
- 1. 当你的代码需要验证数据的情况
- 2. 推荐使用pydantic, Pydantic效率加倍!
- 2.1 如果这个时候当产品说要加"密码必须包含大小写"时,我只需要改一行代码就可以搞定了!
- 3. Pydantic 的核心价值
- 4. 4个超能力让你直呼内行
- 4.1 智能类型转换超贴心
- 4.2 错误提示超级详细
- 4.3 嵌套数据结构也能轻松搞定
- 4.4 配置文件管理神器
1. 当你的代码需要验证数据的情况
def register_user(data):if not isinstance(data.get("name"), str):raise ValueError("名字必须是字符串")if len(data.get("password")) < 6:raise ValueError("密码不能短于6位")if not re.match(r'^[\w\.-]+@[\w\.-]+$', data.get("email")):raise ValueError("邮箱格式不对")# 还有20多个if判断...
2. 推荐使用pydantic, Pydantic效率加倍!
from pydantic import BaseModel, EmailStr, constrclass User(BaseModel):name: strpassword: constr(min_length=6)email: EmailStrphone: str # 后面加个正则就行# 使用只要1行!
valid_data = User(**input_data)
2.1 如果这个时候当产品说要加"密码必须包含大小写"时,我只需要改一行代码就可以搞定了!
password: constr(min_length=6, regex="^(?=.*[a-z])(?=.*[A-Z])")
3. Pydantic 的核心价值
复合规则支持(内置EmailStr、constr等)高级类型,而且还能结构化错误输出(明确标识每个字段的验证问题),非常香!
from pydantic import BaseModel, EmailStr, constrclass UserRegistration(BaseModel):username: strpassword: constr(min_length=8, regex=r"^(?=.*[a-z])(?=.*[A-Z])")email: EmailStrphone: str # 可通过Field添加更复杂规则# 数据验证实例化
try:user_data = UserRegistration(username="tech_guide",password="Simple123",email="contact@example.com",phone="+86-13800138000")
except ValidationError as e:print(e.json(indent=2))
4. 4个超能力让你直呼内行
4.1 智能类型转换超贴心
(自动把"123"转成数字,再也不用写int()了!)
class Demo(BaseModel):age: intdemo = Demo(age="18") # 自动转成整数18
4.2 错误提示超级详细
try:User(name=123, password="123", email="invalid")
except ValidationError as e:print(e.errors())---- 输出错误如下[{"loc": ("name",),"msg": "str类型 expected","type": "type_error.str"},{"loc": ("password",),"msg": "最少需要6个字符","type": "value_error.any_str.min_length"},{"loc": ("email",),"msg": "邮箱格式错误","type": "value_error.email"}
]
4.3 嵌套数据结构也能轻松搞定
如果碰到需要处理JSON嵌套的场景,也是So easy!
class Address(BaseModel):city: strstreet: strclass User(BaseModel):name: straddress: Addressdata = {"name": "张三","address": {"city": "北京","street": "朝阳区"}
}
user = User(**data)
4.4 配置文件管理神器
# 假设这是你的配置文件 config.json
{"database_url": "postgresql://user:pass@localhost/db","timeout": 3.5
}# 定义配置模型
from pydantic import BaseModelclass Settings(BaseModel):debug: bool = False # 默认值 Falsedatabase_url: str # 必填字段timeout: float = 5.0 # 默认值 5.0# 加载配置的函数示例
def load_config():return {"database_url": "postgresql://user:pass@localhost/db","timeout": 3.5}# 使用示例
settings = Settings(**load_config())print(settings)
# 输出:debug=False database_url='postgresql://user:pass@localhost/db' timeout=3.5# 如果尝试错误配置会抛出验证错误:
try:Settings(database_url=123) # 类型错误
except Exception as e:print(e)# 输出:1 validation error for Settings# database_url# Input should be a valid string [type=string_type, input_value=123, input_type=int]