Pydantic中BaseConfig的具體使用
概述
Pydantic是一個(gè)用于數(shù)據(jù)驗(yàn)證和設(shè)置管理的Python庫(kù)。它可以通過(guò)類型注解來(lái)自動(dòng)生成驗(yàn)證和解析邏輯。BaseConfig
是Pydantic模型配置的基類,允許用戶定制模型的行為和驗(yàn)證規(guī)則。
官方文檔鏈接
基礎(chǔ)功能
基本配置
BaseConfig
提供了許多選項(xiàng)來(lái)配置Pydantic模型的行為。下面是一些常用的配置選項(xiàng):
title
: 給模型一個(gè)標(biāo)題。anystr_strip_whitespace
: 自動(dòng)去除字符串前后的空白。min_anystr_length
: 字符串的最小長(zhǎng)度。max_anystr_length
: 字符串的最大長(zhǎng)度。validate_assignment
: 在模型實(shí)例創(chuàng)建后進(jìn)行屬性分配時(shí)驗(yàn)證。
示例代碼
from pydantic import BaseModel class User(BaseModel): name: str age: int class Config: title = "User Model" anystr_strip_whitespace = True min_anystr_length = 2 max_anystr_length = 50 validate_assignment = True # 創(chuàng)建模型實(shí)例 user = User(name=" John Doe ", age=30) print(user.name) # 輸出: "John Doe"
在這個(gè)例子中,User
模型去除了name
字段的前后空白,并設(shè)置了字符串的最小和最大長(zhǎng)度。
進(jìn)階功能
自定義驗(yàn)證器
可以在配置類中定義自定義驗(yàn)證器來(lái)增加驗(yàn)證邏輯。
from pydantic import BaseModel, validator class User(BaseModel): name: str age: int class Config: validate_assignment = True @validator('age') def age_must_be_positive(cls, value): if value <= 0: raise ValueError('Age must be a positive number') return value # 創(chuàng)建模型實(shí)例 user = User(name="Jane Doe", age=25) # 賦值時(shí)驗(yàn)證 user.age = 30 # 成功 user.age = -5 # 拋出 ValueError: Age must be a positive number
高級(jí)教程
配置繼承
可以通過(guò)繼承BaseConfig
類創(chuàng)建一個(gè)通用的配置類,并在多個(gè)模型中復(fù)用。
from pydantic import BaseModel class CommonConfig: anystr_strip_whitespace = True min_anystr_length = 2 max_anystr_length = 50 class User(BaseModel): name: str age: int class Config(CommonConfig): title = "User Model" class Product(BaseModel): name: str price: float class Config(CommonConfig): title = "Product Model" # 創(chuàng)建模型實(shí)例 user = User(name=" John Doe ", age=30) product = Product(name=" Laptop ", price=999.99) print(user.name) # 輸出: "John Doe" print(product.name) # 輸出: "Laptop"
通過(guò)這種方式,可以將公共配置集中管理,減少重復(fù)代碼。
參數(shù)詳解
1. title
為模型指定一個(gè)標(biāo)題。
from pydantic import BaseModel class User(BaseModel): name: str age: int class Config: title = "User Model" print(User.schema()) # 輸出包含 "title": "User Model"
2. anystr_lower
將所有字符串轉(zhuǎn)換為小寫。
class User(BaseModel): name: str class Config: anystr_lower = True user = User(name="John Doe") print(user.name) # 輸出: "john doe"
3. anystr_strip_whitespace
去除字符串前后的空白。
class User(BaseModel): name: str class Config: anystr_strip_whitespace = True user = User(name=" John Doe ") print(user.name) # 輸出: "John Doe"
4. min_anystr_length
字符串的最小長(zhǎng)度。
class User(BaseModel): name: str class Config: min_anystr_length = 2 # user = User(name="A") # 將拋出驗(yàn)證錯(cuò)誤 user = User(name="Ab") print(user.name) # 輸出: "Ab"
5. max_anystr_length
字符串的最大長(zhǎng)度。
class User(BaseModel): name: str class Config: max_anystr_length = 10 # user = User(name="John Doe Long Name") # 將拋出驗(yàn)證錯(cuò)誤 user = User(name="John Doe") print(user.name) # 輸出: "John Doe"
6. validate_all
驗(yàn)證所有字段,而不僅僅是提供的數(shù)據(jù)字段。
class User(BaseModel): name: str age: int class Config: validate_all = True # user = User(name="John") # 將拋出驗(yàn)證錯(cuò)誤,因?yàn)槿鄙賏ge字段 user = User(name="John", age=30) print(user) # 輸出: name='John' age=30
7. extra
決定在模型中是否允許額外的字段。選項(xiàng)有Extra.ignore
, Extra.allow
, Extra.forbid
。
from pydantic import Extra class User(BaseModel): name: str class Config: extra = Extra.forbid # user = User(name="John", age=30) # 將拋出驗(yàn)證錯(cuò)誤,因?yàn)閍ge是多余字段 user = User(name="John") print(user) # 輸出: name='John'
8. allow_mutation
是否允許修改模型實(shí)例的屬性。
class User(BaseModel): name: str class Config: allow_mutation = False user = User(name="John") # user.name = "Doe" # 將拋出驗(yàn)證錯(cuò)誤,因?yàn)槟P筒豢勺? print(user.name) # 輸出: "John"
9. frozen
如果為True,則模型實(shí)例將是不可變的(與allow_mutation
相同)。
class User(BaseModel): name: str class Config: frozen = True user = User(name="John") # user.name = "Doe" # 將拋出驗(yàn)證錯(cuò)誤,因?yàn)槟P褪莾鼋Y(jié)的 print(user.name) # 輸出: "John"
10. allow_population_by_field_name
是否允許通過(guò)字段名稱填充數(shù)據(jù),而不是別名。
class User(BaseModel): full_name: str class Config: allow_population_by_field_name = True fields = { 'full_name': 'name' } user = User(name="John Doe") print(user.full_name) # 輸出: "John Doe"
11. use_enum_values
使用枚舉值而不是枚舉實(shí)例。
from enum import Enum class Color(Enum): RED = 'red' BLUE = 'blue' class Car(BaseModel): color: Color class Config: use_enum_values = True car = Car(color=Color.RED) print(car.color) # 輸出: "red"
12. fields
字段的配置信息,字典形式,鍵為字段名,值為別名或包含別名及其他配置信息的字典。
class User(BaseModel): name: str class Config: fields = { 'name': {'alias': 'full_name'} } user = User(full_name="John Doe") print(user.name) # 輸出: "John Doe"
13. validate_assignment
分配新值時(shí)驗(yàn)證字段。
class User(BaseModel): age: int class Config: validate_assignment = True user = User(age=25) user.age = 30 # user.age = -5 # 將拋出驗(yàn)證錯(cuò)誤,因?yàn)閍ge必須是正整數(shù) print(user.age) # 輸出: 30
14. error_msg_templates
自定義錯(cuò)誤消息模板。
class User(BaseModel): age: int class Config: error_msg_templates = { 'value_error': 'Invalid value provided.' } # user = User(age=-5) # 將拋出驗(yàn)證錯(cuò)誤: Invalid value provided. user = User(age=25) print(user.age) # 輸出: 25
15. arbitrary_types_allowed
允許使用任意類型。
class CustomType: pass class User(BaseModel): custom: CustomType class Config: arbitrary_types_allowed = True user = User(custom=CustomType()) print(user.custom) # 輸出: <__main__.CustomType object at 0x...>
16. orm_mode
啟用ORM支持,允許從ORM對(duì)象填充數(shù)據(jù)。
class UserOrm: def __init__(self, name): self.name = name class User(BaseModel): name: str class Config: orm_mode = True user_orm = UserOrm(name="John Doe") user = User.from_orm(user_orm) print(user.name) # 輸出: "John Doe"
17. getter_dict
自定義getter字典類。
class CustomGetterDict(GetterDict): def get(self, item, default=None): return f'custom_{super().get(item, default)}' class User(BaseModel): name: str class Config: getter_dict = CustomGetterDict data = {'name': 'John Doe'} user = User.parse_obj(data) print(user.name) # 輸出: "custom_John Doe"
18. alias_generator
別名生成器函數(shù),用于自動(dòng)生成字段別名。
class User(BaseModel): full_name: str class Config: alias_generator = lambda x: x.upper() user = User(FULL_NAME="John Doe") print(user.full_name) # 輸出: "John Doe"
19. keep_untouched
保持未修改的類型元組。
class SomeType: pass class User(BaseModel): some: SomeType class Config: keep_untouched = (SomeType,) user = User(some=SomeType()) print(user.some) # 輸出: <__main__.SomeType object at 0x...>
20. schema_extra
額外的JSON模式定義,可以是字典或返回字典的可調(diào)用對(duì)象。
class User(BaseModel): name: str age: int class Config: schema_extra = { "example": { "name": "John Doe", "age": 30 } } print(User.schema_json(indent=2)) # 輸出包含 "example": {"name": "John Doe", "age": 30}
21. json_loads
自定義JSON加載函數(shù)。
import json def custom_json_loads(value): return json.loads(value) class User(BaseModel): name: str class Config: json_loads = custom_json_loads user = User.parse_raw('{"name": "John Doe"}') print(user.name) # 輸出: "John Doe"
22. json_dumps
自定義JSON序列化函數(shù)。
import json def custom_json_dumps(value, **kwargs): return json.dumps(value, **kwargs) class User(BaseModel): name: str class Config: json_dumps = custom_json_dumps user = User(name="John Doe") print(user.json()) # 輸出: {"name": "John Doe"}
23. json_encoders
自定義JSON編碼器字典,鍵為類型或字符串,值為編碼函數(shù)。
from datetime import datetime class User(BaseModel): created_at: datetime class Config: json_encoders = { datetime: lambda v: v.isoformat() } user = User(created_at=datetime(2020, 1, 1)) print(user.json()) # 輸出: {"created_at": "2020-01-01T00:00:00"}
24. underscore_attrs_are_private
以下劃線開頭的屬性是否被視為私有。
class User(BaseModel): _private: str class Config: underscore_attrs_are_private = True user = User(_private="secret") print(user.dict()) # 輸出: {}
25. copy_on_model_validation
是否在模型驗(yàn)證時(shí)復(fù)制繼承的模型。
class BaseModelWithConfig(BaseModel): class Config: copy_on_model_validation = True class User(BaseModelWithConfig): name: str user = User(name="John") print(user.name) # 輸出: "John"
26. smart_union
是否在嘗試轉(zhuǎn)換前檢查所有允許的類型。
from typing import Union class User(BaseModel): value: Union[int, str] class Config: smart_union = True user = User(value="123") print(user.value) # 輸出: "123"
希望這些示例代碼能幫助你更好地理解Pydantic中BaseConfig
類的各個(gè)參數(shù)及其用法。
總結(jié)
BaseConfig
提供了強(qiáng)大的配置選項(xiàng),使得Pydantic模型更加靈活和可定制。通過(guò)掌握這些配置選項(xiàng),可以更加高效地進(jìn)行數(shù)據(jù)驗(yàn)證和管理。
到此這篇關(guān)于Pydantic中BaseConfig的具體使用的文章就介紹到這了,更多相關(guān)Pydantic BaseConfig內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
TensorFlow繪制loss/accuracy曲線的實(shí)例
今天小編就為大家分享一篇TensorFlow繪制loss/accuracy曲線的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01使用PyWeChatSpy自動(dòng)回復(fù)微信拍一拍功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了用PyWeChatSpy自動(dòng)回復(fù)微信拍一拍功能,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07總結(jié)Python函數(shù)參數(shù)的六種類型
這篇文章主要總結(jié)了Python函數(shù)參數(shù)的六種類型,傳遞參數(shù)實(shí)現(xiàn)不同場(chǎng)景的靈活使用,下面總結(jié)的六種函數(shù)參數(shù)類型,需要的小伙伴可以參考一下2022-03-03深入分析python數(shù)據(jù)挖掘 Json結(jié)構(gòu)分析
這篇文章通過(guò)實(shí)例給大家分析總結(jié)了python數(shù)據(jù)挖掘以及Json結(jié)構(gòu)分析的相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友參考下。2018-04-04Jupyter notebook無(wú)法導(dǎo)入第三方模塊的解決方式
這篇文章主要介紹了Jupyter notebook無(wú)法導(dǎo)入第三方模塊的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python創(chuàng)建學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python創(chuàng)建學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11如何使用celery進(jìn)行異步處理和定時(shí)任務(wù)(django)
文章介紹了Celery的基本概念、安裝方法、如何使用Celery進(jìn)行異步任務(wù)處理以及如何設(shè)置定時(shí)任務(wù),通過(guò)Celery,可以在Web應(yīng)用中處理后臺(tái)任務(wù),如發(fā)送郵件、視頻轉(zhuǎn)碼等,而不阻塞Web請(qǐng)求,文章還提到了啟動(dòng)Celery worker和beat的命令以及任務(wù)和定時(shí)任務(wù)的執(zhí)行效果2025-01-01