Pydantic中model_validator的實(shí)現(xiàn)
引言
在 Pydantic 中,除了可以使用 field_validator
裝飾器對單個(gè)字段進(jìn)行驗(yàn)證外,還可以使用 model_validator
裝飾器對整個(gè)模型進(jìn)行驗(yàn)證。model_validator
允許您在字段級驗(yàn)證之后,對模型的整個(gè)數(shù)據(jù)進(jìn)行額外的驗(yàn)證。在本教程中,我們將探討如何使用 model_validator
裝飾器來創(chuàng)建自定義的模型驗(yàn)證邏輯。
基礎(chǔ)知識
在開始之前,請確保您已經(jīng)安裝了 Pydantic。如果沒有,請使用以下命令安裝:
pip install pydantic
創(chuàng)建 Pydantic 模型
首先,讓我們創(chuàng)建一個(gè)簡單的 Pydantic 模型。這個(gè)模型將包含兩個(gè)字段:a
和 b
。
from pydantic import BaseModel class Model(BaseModel): a: str b: int
使用 model_validator 裝飾器
model_validator
裝飾器允許您為模型添加自定義驗(yàn)證邏輯。要使用它,請按照以下步驟操作:
導(dǎo)入 model_validator
: 從 pydantic
導(dǎo)入 model_validator
。
from pydantic import BaseModel, model_validator
定義驗(yàn)證函數(shù): 創(chuàng)建一個(gè)類方法,該方法接受一個(gè)參數(shù)(模型的 dict
表示)并返回驗(yàn)證后的模型。
class Model(BaseModel): a: str b: int @model_validator @classmethod def check_a_and_b(cls, values: dict): if values['a'] != ' foobar ': raise ValueError('Field "a" must contain " foobar "') if values['b'] < 10: raise ValueError('Field "b" must be at least 10') return cls(**values)
在這個(gè)例子中,我們定義了一個(gè)名為 check_a_and_b
的驗(yàn)證函數(shù),它檢查 a
字段的值是否包含子字符串 " foobar "
,以及 b
字段的值是否至少為 10。
3. 應(yīng)用裝飾器: 使用 @model_validator
語法將裝飾器應(yīng)用于驗(yàn)證函數(shù)。
4. 測試模型: 創(chuàng)建模型實(shí)例并測試驗(yàn)證邏輯。
# 正確的值 model = Model(a=' foobar ', b=20) print(model) # 錯(cuò)誤的值 try: model = Model(a='snap', b=5) except ValidationError as exc_info: print(exc_info)
在上面的例子中,第一個(gè)模型實(shí)例成功創(chuàng)建,因?yàn)?nbsp;a
字段的值包含 " foobar "
并且 b
字段的值至少為 10。第二個(gè)實(shí)例創(chuàng)建失敗,因?yàn)?nbsp;a
字段的值不包含 " foobar "
,并且 b
字段的值小于 10,因此拋出了 ValidationError
。
高級用法
model_validator
裝飾器還支持一些高級功能,如:
自定義驗(yàn)證模式: 通過設(shè)置 mode
參數(shù),可以指定驗(yàn)證是在字段驗(yàn)證前還是驗(yàn)證后進(jìn)行。
@model_validator(mode='before')
檢查字段存在性: 通過設(shè)置 check_fields
參數(shù),可以控制是否檢查字段是否實(shí)際存在于模型中。
@model_validator(check_fields=False)
model_validator 裝飾器源碼
以下是 model_validator
裝飾器的簡化版源碼:
def model_validator(mode: ModelValidatorModes = 'after', check_fields: bool | None = None) -> Callable[[Any], Any]: def dec(f: Callable[..., Any] | staticmethod[Any, Any] | classmethod[Any, Any, Any]) -> _decorators.PydanticDescriptorProxy[Any]: if _decorators.is_instance_method_from_sig(f): raise PydanticUserError( '`@model_validator` cannot be applied to instance methods', code='validator-instance-method' ) # auto apply the @classmethod decorator f = _decorators.ensure_classmethod_based_on_signature(f) dec_info = _decorators.ModelValidatorDecoratorInfo(mode=mode, check_fields=check_fields) return _decorators.PydanticDescriptorProxy(f, dec_info) return dec
源碼解讀
裝飾器定義:
model_validator
函數(shù)定義了一個(gè)裝飾器,它接受兩個(gè)可選的關(guān)鍵字參數(shù):mode
和 check_fields
。
內(nèi)部函數(shù) dec
:
dec
是一個(gè)內(nèi)部函數(shù),它接受一個(gè)可調(diào)用對象f
作為參數(shù),并返回一個(gè)_decorators.PydanticDescriptorProxy
對象。- 代碼首先檢查
f
是否是實(shí)例方法。如果是,拋出PydanticUserError
,因?yàn)?nbsp;model_validator
不能應(yīng)用于實(shí)例方法。 - 然后,確保
f
是一個(gè)類方法。 - 創(chuàng)建一個(gè)包含模式和字段檢查標(biāo)志的
_decorators.ModelValidatorDecoratorInfo
對象。 - 最后,返回一個(gè)
_decorators.PydanticDescriptorProxy
對象,它包裝了原始的函數(shù)f
和模型驗(yàn)證信息。
返回 dec
:
model_validator
函數(shù)返回 dec
函數(shù),它將作為裝飾器應(yīng)用于驗(yàn)證函數(shù)。
結(jié)論
在本教程中,我們學(xué)習(xí)了如何使用 Pydantic 的 model_validator
裝飾器來為模型添加自定義驗(yàn)證邏輯。通過這個(gè)強(qiáng)大的工具,您可以對整個(gè)模型的數(shù)據(jù)進(jìn)行復(fù)雜的驗(yàn)證,從而確保數(shù)據(jù)的準(zhǔn)確性和完整性。
到此這篇關(guān)于Pydantic中model_validator的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pydantic model_validator內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)求解斐波那契第n項(xiàng)的解法(包括矩陣乘法+快速冪)
這篇文章主要介紹怎么使用Python求解斐波那契第n項(xiàng),方法多樣,邏輯清晰,代碼簡單詳細(xì),有這方面需要的朋友可以參考下2021-04-04Python使用OpenCV和K-Means聚類對畢業(yè)照進(jìn)行圖像分割
圖像分割是將圖像分割成多個(gè)不同區(qū)域(或片段)的過程。目標(biāo)是將圖像的表示變成更容易和更有意義的圖像。在這篇博客中,我們詳細(xì)的介紹了使用方法,感興趣的可以了解一下2021-06-06對TensorFlow中的variables_to_restore函數(shù)詳解
今天小編就為大家分享一篇對TensorFlow中的variables_to_restore函數(shù)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python web框架(django,flask)實(shí)現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例
這篇文章主要介紹了Python web框架(django,flask)實(shí)現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-11-11PyQt5實(shí)現(xiàn)界面(頁面)跳轉(zhuǎn)的示例代碼
這篇文章主要介紹了PyQt5實(shí)現(xiàn)界面跳轉(zhuǎn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Python數(shù)據(jù)結(jié)構(gòu)之樹的全面解讀
數(shù)據(jù)結(jié)構(gòu)中有很多樹的結(jié)構(gòu),其中包括二叉樹、二叉搜索樹、2-3樹、紅黑樹等等。本文中對數(shù)據(jù)結(jié)構(gòu)中常見的樹邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)進(jìn)行了匯總,不求嚴(yán)格精準(zhǔn),但求簡單易懂2021-11-11python機(jī)器基礎(chǔ)邏輯回歸與非監(jiān)督學(xué)習(xí)
這篇文章主要為大家介紹了python機(jī)器基礎(chǔ)邏輯回歸與非監(jiān)督的學(xué)習(xí)講解u,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11python如何實(shí)現(xiàn)數(shù)組元素兩兩相加
這篇文章主要介紹了python如何實(shí)現(xiàn)數(shù)組元素兩兩相加,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05