Pydantic最近釋出了其V2版本的alpha版本。熟悉Python的同學都應該聽說過Pydantic。
Pydantic是Python語言的開源類型規範和校驗庫,可提供強大的資料解析和驗證。包括運作時強制類型提示、友好的錯誤消息和設定管理功能等。
那麼這次V2版本帶來什麼樣的變化呢,我們一起來學習一下。
新版變化
Rust重寫核心
Pydantic V2 最大的變化是pydantic-core。所有驗證邏輯都已用Rus重寫并移至單獨的包pydantic-core中。用Rust重寫後來的巨大優勢:
性能 ——Pydantic V2比Pydantic V1快5-50倍。
安全性和可維護性 ——pydanti架構進行了更改,新架構Pydantic V2将更加容易維護,更加安全,減少Bug。
随着使用pydantic-core,Pydantic庫中的大部分邏輯,将使用“pydantic core schema”風格生成。使用的schema來定義了新的、高性能的pydantic-core行為驗證器和序列化器。
其他變化
BaseModel
Pydantic的各種方法名稱已更改;BaseModel方法都以model_為字首。為了簡化遷移,在可能的情況下,盡量保留了舊的方法名稱,但調用他們會導緻 DeprecationWarning的提示。
一些内置資料加載功能已計劃删除。尤其是parse_raw和parse_file都已棄用。 需要先加載資料,将其傳遞給model_validate處理。
from_orm方法已被删除;需要使用model_validate(相當于parse_obj來自 Pydantic V1) 來實作類似的東西。但是,可設定from_attributes=True在模型配置啟用。
__eq__模型的方法已更改;模型不再被認為等于字典。
風俗__init__不會調用覆寫。應該替換為 @root_validator。
由于與庫的其餘部分不一緻,删除了模型的特殊行為__root__字段使用,并禁止使用具有此名稱的屬性以防止混淆。但是,可以通過使用“标準”字段名稱實作等效行為 @root_validator, @model_serializer,和 __pydantic_modify_json_schema__。
資料類
Pydantic資料類中__post_init__新版本中将在驗證之後調用,而不是之前。
資料類中不再支援 extra='allow'對于,傳遞給初始化程式的額外屬性将是存儲為資料類的額外字段。 extra='ignore'仍然支援在解析資料時允許額外的字段;隻是不被存儲。
__post_init_post_parse__已被删除。
嵌套資料類不再接受元組作為輸入,隻接受字典。
配置更改
要在模型上指定配置,現在不推薦建立一個名為Config在父級的命名空間中 BaseModel子類。 相反,隻需要設定一個名為model_config成為一個包含你想用作配置的鍵/值對的字典。
以下配置已被删除:
allow_mutation.
error_msg_templates.
fields—這是各種錯誤的來源,是以已被删除。應該能夠使用Annotated在字段上根據需要修改它們。
getter_dict— orm_mode 已被删除。
schema_extra——使用json_schema_extra關鍵字參數 pydantic.Field. smart_union.
underscore_attrs_are_private— V2 行為可設定為和Pydantic V1 相同 。
以下配置設定已重命名:
allow_population_by_field_name→ populate_by_name
anystr_lower→ str_to_lower
anystr_strip_whitespace→ str_strip_whitespace
anystr_upper→ str_to_upper
keep_untouched→ ignored_types
max_anystr_length→ str_max_length
min_anystr_length→ str_min_length
orm_mode→ from_attributes
validate_all→ validate_default
驗證器的變化
提高一個TypeError在驗證器内部不再産生 ValidationError, 但隻是提高了 TypeError直接地。 這對于防止某些常見錯誤(例如調用具有無效簽名的函數)是必要的 被無意中轉化為 ValidationError并展示給使用者。 如果你真的想要 TypeError轉換成 ValidationError你應該使用 try: except:将捕獲它并進行轉換的塊。
each_item驗證器已棄用,應使用類型注釋替換 Annotated應用驗證器 或者使用在頂層對所有項目進行操作的驗證器。
更改為 @validator-修飾函數簽名。
stricturl類型已被删除。
根驗證器不能再運作skip_on_failure=False.
更改特定類型的驗證
超出64位整數有效範圍的整數将導緻ValidationErrors在解析期間。要解決此問題,請使用IsInstance驗證器。
内置的子類不會驗證為它們的子類類型; 需要使用IsInstance驗證器來驗證這些類型。
通用模型更改
雖然它不會在運作時引發錯誤,但不應再使用參數化泛型的子類檢查。但是,可以針對非參數化 通用模型進行子類檢查
其他變化
GetterDict已被删除,因為它隻是一個實作細節orm_mode,已被删除。
分析類型
Pydantic V1沒有很好地支援驗證或序列化非BaseModel。要使用它們,必須建立一個“根”模型或使用實用程式函數 pydantic.tools( parse_obj_as和 schema_of)。
在Pydantic V2 中,要容易得多:AnalyzedType類讓你建構一個行為幾乎像 BaseModel類,可以将其用于根模型的許多用例,并完全替代parse_obj_as和 schema_of。
from typing import List
from pydantic import AnalyzedType
validator = AnalyzedType(List[int])
assert validator.validate_python(['1', '2', '3']) == [1, 2, 3]
print(validator.json_schema())
#結果: {'type': 'array', 'items': {'type': 'integer'}}
注意,此API是臨時的,可能會在Pydantic V2的最終版本之前更改。
已經支援的功能
以下是VPydantic V2 alpha版本中已經完成可以測試和驗證的功能包。
BaseModel ——Pydantic V1 中的驗證核心仍然存在,盡管使用了新的方法名稱。
資料類 - Pydantic資料類得到改進并準備好進行測試。
序列化 ——轉儲/序列化/編組明顯更加靈活,并且可以進行測試。
嚴格模式 ——Pydantic V2 中最大的新增功能之一是嚴格模式,它已準備好進行測試。
JSON Schema - JSON Schema 的生成得到了很大改進,可以進行測試。
通用模型 - 得到很大改進并準備好進行測試。
遞歸模型 ——遞歸資料結構的驗證得到了很大改進,可以進行測試。
自定義類型 - 自定義類型有一個新的接口,可以進行測試。
自定義字段修飾符 - 通過使用 Annotated[]正在 Pydantic 本身工作和使用。
沒有 BaseModel 的驗證 ——新的 AnalyzedType類允許驗證而不需要 BaseModel類,它已準備好進行測試。
TypedDict - 現在完全支援 TypedDict通過 AnalyzedType,就可以測試了。
還在開發中的功能
文檔 ——V2的完整文檔正在撰寫中,希望你了解并參與協作。
轉換表 ——文檔的一個重要補充将是一個轉換表,顯示類型是如何被強制轉換的,這是一個 WIP。
基本設定 - BaseSettings将移動到一個單獨的pydantic-settings包,它還沒有準備好測試。
注意:pydantic-settings尚未準備好釋出,在第一個alpha 版本中不支援 BaseSettings。
validate_arguments - validate_arguments裝飾器仍然存在并正在工作,但尚未更新。
假設插件 - 假設插件尚未更新。
計算字段 ——已經把包含在Pydantic V2正式釋出中。
錯誤消息 - 可以使用一些,錯誤消息中的文檔連結仍有待添加。
遷移指南 – 有一些一些提示,尚需完善。
遷移試用
要開始使用Pydantic V2 alpha,需要通過PyPI安裝。為了避免對你的項目造成影響建議使用虛拟環境來和線上環境進行:
pip install --pre -U "pydantic>=2.0a1"
請注意,由于V2尚處于alpha測試階段,功能上尚顯粗糙和不考慮不周之處,試用用當中難免遇到錯誤。
請及時回報,建議在項目托管的GitHub倉庫建立問題,問題中請用bug V2标簽進行标示,以便及時分類和處理。
另外有如何建議和意見,請給開發團隊進行回報。