天天看點

Pydantic V2 釋出alpha版本,完全用Rust重寫核心,性能提高50倍

Pydantic V2 釋出alpha版本,完全用Rust重寫核心,性能提高50倍

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标簽進行标示,以便及時分類和處理。

另外有如何建議和意見,請給開發團隊進行回報。