前言
在 pydantic 中定義對象的主要方法是通過模型(模型繼承 BaseModel )。
pydantic主要是一個解析庫,而不是驗證庫。驗證是達到目的的一種手段:建立一個符合所提供的類型和約束的模型。
換句話說,pydantic保證輸出模型的類型和約束,而不是輸入數據。
雖然驗證不是pydantic的主要目的,但您可以使用此庫進行自定義驗證。
基本模型使用
User這是一個模型,它有兩個字段id,一個是整數,是必需的,name一個是字符串,不是必需的(它有一個默認值)
from pydantic import BaseModel
class User(BaseModel):
id: int
name = 'yo yo'
類型name是從默認值(字符串)推斷出來的,因此不需要類型注釋(但是請注意當某些字段沒有類型注釋時有關字段順序的警告)
user = User(id='123')
user這是一個實例User。對象的初始化將執行所有解析和驗證,如果沒有ValidationError引發,說明生成的模型實例是有效的。
user實例有 id 和 name 2個屬性
user = User(id='123')
print(user.id) # 123
print(user.name) # yo yo
模型的字段可以作為用戶對象的普通屬性訪問。字符串 '123' 已根據字段類型轉換為 int.
name初始化用戶時未設置,因此它具有默認值.
那么如何知道初始化的時候,需要哪些必填字段?可以通過 __fields_set__
方法
print(user.__fields_set__) # {'id'}
.dict()
可以將user對象的屬性,轉成字典格式輸出,dict(user)
也是等價的
print(user.dict()) # {'id': 123, 'name': 'yo yo'}
print(dict(user)) # {'id': 123, 'name': 'yo yo'}
.json()
可以將user對象的屬性,轉成json格式輸出
print(user.json()) # {"id": 123, "name": "yo yo"}
BaseModel 模型屬性
上面的例子只是展示了模型可以做什么的冰山一角。模型具有以下方法和屬性:
dict() 返回模型字段和值的字典;參看。導出模型
json() 返回一個 JSON 字符串表示dict();參看。導出模型
copy() 返回模型的副本(默認為淺拷貝);參看。導出模型
parse_obj() 如果對象不是字典,則用於將任何對象加載到具有錯誤處理的模型中的實用程序;參看。輔助函數
parse_raw() 用於加載多種格式字符串的實用程序;參看。輔助函數
parse_file() 喜歡parse_raw()但是對於文件路徑;參看。輔助函數
from_orm() 將數據從任意類加載到模型中;參看。ORM模式
schema() 返回將模型表示為 JSON Schema 的字典;參看。圖式
schema_json() schema()返回;的 JSON 字符串表示形式 參看。圖式
construct() 無需運行驗證即可創建模型的類方法;參看。創建沒有驗證的模型
__fields_set__
初始化模型實例時設置的字段名稱集
__fields__
模型字段的字典
__config__
模型的配置類,cf。模型配置
遞歸模型
可以使用模型本身作為注釋中的類型來定義更復雜的分層數據結構。
from typing import List
from pydantic import BaseModel
class Foo(BaseModel):
count: int
size: float = None
class Bar(BaseModel):
apple = 'x'
banana = 'y'
class Spam(BaseModel):
foo: Foo
bars: List[Bar]
m = Spam(foo={'count': 4}, bars=[{'apple': 'x1'}, {'apple': 'x2'}])
print(m)
#> foo=Foo(count=4, size=None) bars=[Bar(apple='x1', banana='y'),
#> Bar(apple='x2', banana='y')]
print(m.dict())
"""
{
'foo': {'count': 4, 'size': None},
'bars': [
{'apple': 'x1', 'banana': 'y'},
{'apple': 'x2', 'banana': 'y'},
],
}
"""
輔助函數
Pydantic為解析數據的模型提供了三個classmethod輔助函數:
- parse_obj:這與模型的方法非常相似__init__,除了它需要一個字典而不是關鍵字參數。如果傳遞的對象不是 dict,ValidationError則將引發。
- parse_raw:這需要一個str或bytes並將其解析為json,然后將結果傳遞給parse_obj. 通過適當地設置參數也支持解析泡菜數據。content_type
- parse_file: 這需要一個文件路徑,讀取文件並將內容傳遞給parse_raw. 如果content_type省略,則從文件的擴展名推斷。
parse_obj 的使用
from datetime import datetime
from pydantic import BaseModel, ValidationError
class User(BaseModel):
id: int
name = 'John Doe'
signup_ts: datetime = None
m = User.parse_obj({'id': 123, 'name': 'James'})
print(m) # id=123 signup_ts=None name='James'
parse_raw 需要一個str或bytes並將其解析為json
m = User.parse_raw('{"id": 123, "name": "James"}')
print(m) # > id=123 signup_ts=None name='James'
parse_file 可以讀取一個文件的內容
data.json文件
{
"id": 123,
"name": "James"
}
from pathlib import Path
path = Path('data.json') # 讀取文件內容
m = User.parse_file(path)
print(m) # > id=123 signup_ts=None name='James'
.write_text()可以自己寫內容到文件
from pathlib import Path
path = Path('data1.json')
path.write_text('{"id": 345, "name": "James 11"}')
m = User.parse_file(path)
print(m) # > id=345 name='James 11'