Pydantic 的实际用途:
1.替你自动检查数据格式:不用手动写一堆 if-else 判断。
2.快速发现错误:有问题会直接告诉你哪里错了。
3.确保数据 “合规”:比如 API 接口收到的参数、用户填写的表单,用它可以保证数据符合你的要求。
最常见的场景是在写后端接口时,用它来验证用户提交的数据是否正确,避免错误数据进入系统。
重点
#重点
在 Python 中,List[int] 和 list[int] 都是用来表示一个只包含整数的列表的类型注解。不过,他们来自两个不同的库,有些微小的区别。
List[int] 来自 typing 模块,这个模块在 Python 3.5 版本引入,主要用来支持更丰富的类型注解。List 是一个泛型类,你可以用它来指定列表中元素的类型,比如 List[int] 就表示一个整数列表。
list[int] 则是在 Python 3.9 版本中引入的,作为内置的 list 类的泛型版本。它的行为和 List[int] 基本上是一样的,但更符合 Python 的语法习惯。
所以,如果你的代码需要在 Python 3.9 之前的版本上运行,你应该使用 List[int],否则你可以选择使用 list[int]。需要注意的是,无论使用哪种方式,都需要确保你的代码运行在开启了类型注解的环境中。
Python 的类型注解是一种可选的特性,你可以通过以下步骤来确认你的代码是否在开启了类型注解的环境中运行:
使用 typing 模块:Python 的 typing 模块提供了一套丰富的类型系统,你可以用它来为函数参数、返回值以及变量添加类型注解。如果你的代码中使用了 typing 模块,并且没有遇到 ImportError,那么就说明你的环境支持类型注解。
运行静态类型检查器:Python 的类型注解在运行时并不会造成任何效果,它们主要是为了提供给静态类型检查器(例如 mypy、pytype 或 PyCharm)使用的。你可以尝试运行这些工具来检查你的代码,如果它们可以正常工作,那么就说明你的环境支持类型注解。
检查 Python 版本:Python 的类型注解功能在 Python 3.5 版本引入。如果你的环境中的 Python 版本低于这个版本,那么就不支持类型注解。你可以通过运行 python --version 命令来查看你的 Python 版本。
color console

**结构赋值
class Demo(BaseModel): name: str price: float is_offer: Union[bool, None] = None descrition: List[str] = []
赋初始值被认为是 Optional 字段,否则被认为是 Required 字段
也可以通过 Optional 明确指定
另外,如果指定了字段类型,那么通过以下方式确认字段时也是有顺序的
print(Demo.__fields__.keys())
不同包之间的版本兼容性
pytcharm可以安装pydantic 插件
copy浅拷贝
pydantic模块中引入BaseModel构建基本数据模型,ValidationError来捕获在对模型校验时发生的异常
从typing模块中引入List、Optional等类,方便进行类型标注
继承了BaseModel的自定义数据模型类,可以使用如下方法来达到数据的转换:
实例.dict() --> 返回python的字典类型
实例.json() --> 返回json字符串
实例.copy() --> 浅拷贝数据
类.parse_obj(obj=...) --> 将python的字典类型转换为数据模型
类.parse_raw(str) --> 将json字符串转换为数据模型
类.parse_file(path) --> 将文件内的json数据转换为数据模型
实例.schema() --> 返回schema形式的数据格式
实例.schema_json() --> 以json字符串来返回schema形式的数据
类.construct(obj=) --> 不执行数据类型校验的parse_obj
4. pydantic模型可以互相嵌套
5. 使用sqlalchemy中构建ORM模型,并在pydantic模型中建立联系
6. 使用pydantic模型类的from_orm()方法来构造ORM模型和pydantic模型的连接体模型。
pycharm 中使用anoconda python 编辑器,但是python console直接显示error exit 1:
import _ssl DLL load fail error
解决方法:
From anaconda3\Library\bin copy below files and paste them in anaconda3/DLLs:
- libcrypto-1_1-x64.dll
- libssl-1_1-x64.dll
https://stackoverflow.com/questions/54175042/python-3-7-anaconda-environment-import-ssl-dll-load-fail-error
from datetime import datetime
from pathlib import Path
from typing import List, Optional
from pydantic import BaseModel, ValidationError, constr
from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
print("\033[31m1. --- Pydantic的基本用法。Pycharm可以安装Pydantic插件 ---\033[0m")
class User(BaseModel):
id: int
name: str = "john snow"
signup_ts: datetime
friends: List[int] = []
external_data = {
"id": "123",
"signup_ts": "2021-08-09 11:12:30",
"friends": ["1", 2, 4]
}
# if __name__ == '__main__':
user = User(**external_data)
print(user.id, user.name)
print(user.dict())
print("\033[31m2. --- 校验失败处理 ---\033[0m")
try:
u = User(id=1, signup_ts=datetime.today(), friends=['not a number', 1])
print(u)
except ValidationError as e:
print(e.json())
print("\033[31m3. --- 模型类的属性和方法 ---\033[0m")
print(user.dict())
print(user.json())
print(user.copy())
# 类方法
print("类方法")
print(User.parse_obj(external_data))
print(User.parse_raw('{"id": 123, "name": "john snow", "signup_ts": "2021-08-09T11:12:30", "friends": [1, 2, 4]}'))
file = Path("pydanic_tutorial.json")
file.write_text('{"id": 123, "name": "john snow", "signup_ts": "2021-08-09T11:12:30", "friends": [1, 2, 4]}')
print(User.parse_file(file))
print(user.schema())
print(user.schema_json())
# 不校验属性, 直接构造
print(User.construct(id="sdf", signup_ts=datetime.today(), friends=['not a number', 1]))
print(User.__fields__.keys())
print("\033[31m4. --- 递归模型 ---\033[0m")
class Sound(BaseModel):
sound: str
class Dog(BaseModel):
name: str
weight: Optional[float] = None
sound: List[Sound]
# dog = Dog(name="hello kitty", weight=1.8, sound=[{"sound": "wangwang~"}, {"sound": "yingying ~"}])
# print(dog.dict())
dog1 = Dog(name="hello kitty", weight=1.8, sound=[Sound(sound="wangwang~"), Sound(sound="yingying~")])
print(dog1.dict())
print("\033[31m5. --- ORM模型:从类实例创建符合ORM对象的模型 ---\033[0m")
Base = declarative_base()
class CompanyOrm(Base):
__tablename__ = 'companies'
id = Column(Integer, primary_key=True, nullable=False)
public_key = Column(String(20), index=True, nullable=False, unique=True)
name = Column(String(63), unique=True)
domains = Column(ARRAY(String(255)))
class CompanyModel(BaseModel):
id: int
public_key: constr(max_length=20)
name: constr(max_length=63)
domains: List[constr(max_length=255)]
class Config:
orm_mode = True
co_orm = CompanyOrm(
id=123,
public_key='foobar',
name='Testing',
domains=['example.com', 'foobar.com'],
)
print(CompanyModel.from_orm(co_orm))
Pydantic库
conda install pydantic -c conda-forge