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)換為小寫(xiě)。
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
以下劃線開(kāi)頭的屬性是否被視為私有。
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-04
Jupyter notebook無(wú)法導(dǎo)入第三方模塊的解決方式
這篇文章主要介紹了Jupyter notebook無(wú)法導(dǎo)入第三方模塊的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python創(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

