Pydantic中BaseConfig的具體使用
概述
Pydantic是一個用于數(shù)據(jù)驗證和設置管理的Python庫。它可以通過類型注解來自動生成驗證和解析邏輯。BaseConfig是Pydantic模型配置的基類,允許用戶定制模型的行為和驗證規(guī)則。
官方文檔鏈接
基礎功能
基本配置
BaseConfig提供了許多選項來配置Pydantic模型的行為。下面是一些常用的配置選項:
title: 給模型一個標題。anystr_strip_whitespace: 自動去除字符串前后的空白。min_anystr_length: 字符串的最小長度。max_anystr_length: 字符串的最大長度。validate_assignment: 在模型實例創(chuàng)建后進行屬性分配時驗證。
示例代碼
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)建模型實例
user = User(name=" John Doe ", age=30)
print(user.name) # 輸出: "John Doe"
在這個例子中,User模型去除了name字段的前后空白,并設置了字符串的最小和最大長度。
進階功能
自定義驗證器
可以在配置類中定義自定義驗證器來增加驗證邏輯。
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)建模型實例
user = User(name="Jane Doe", age=25)
# 賦值時驗證
user.age = 30 # 成功
user.age = -5 # 拋出 ValueError: Age must be a positive number
高級教程
配置繼承
可以通過繼承BaseConfig類創(chuàng)建一個通用的配置類,并在多個模型中復用。
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)建模型實例
user = User(name=" John Doe ", age=30)
product = Product(name=" Laptop ", price=999.99)
print(user.name) # 輸出: "John Doe"
print(product.name) # 輸出: "Laptop"
通過這種方式,可以將公共配置集中管理,減少重復代碼。
參數(shù)詳解
1. title
為模型指定一個標題。
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
將所有字符串轉換為小寫。
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
字符串的最小長度。
class User(BaseModel):
name: str
class Config:
min_anystr_length = 2
# user = User(name="A") # 將拋出驗證錯誤
user = User(name="Ab")
print(user.name) # 輸出: "Ab"
5. max_anystr_length
字符串的最大長度。
class User(BaseModel):
name: str
class Config:
max_anystr_length = 10
# user = User(name="John Doe Long Name") # 將拋出驗證錯誤
user = User(name="John Doe")
print(user.name) # 輸出: "John Doe"
6. validate_all
驗證所有字段,而不僅僅是提供的數(shù)據(jù)字段。
class User(BaseModel):
name: str
age: int
class Config:
validate_all = True
# user = User(name="John") # 將拋出驗證錯誤,因為缺少age字段
user = User(name="John", age=30)
print(user) # 輸出: name='John' age=30
7. extra
決定在模型中是否允許額外的字段。選項有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) # 將拋出驗證錯誤,因為age是多余字段
user = User(name="John")
print(user) # 輸出: name='John'
8. allow_mutation
是否允許修改模型實例的屬性。
class User(BaseModel):
name: str
class Config:
allow_mutation = False
user = User(name="John")
# user.name = "Doe" # 將拋出驗證錯誤,因為模型不可變
print(user.name) # 輸出: "John"
9. frozen
如果為True,則模型實例將是不可變的(與allow_mutation相同)。
class User(BaseModel):
name: str
class Config:
frozen = True
user = User(name="John")
# user.name = "Doe" # 將拋出驗證錯誤,因為模型是凍結的
print(user.name) # 輸出: "John"
10. allow_population_by_field_name
是否允許通過字段名稱填充數(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
使用枚舉值而不是枚舉實例。
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
分配新值時驗證字段。
class User(BaseModel):
age: int
class Config:
validate_assignment = True
user = User(age=25)
user.age = 30
# user.age = -5 # 將拋出驗證錯誤,因為age必須是正整數(shù)
print(user.age) # 輸出: 30
14. error_msg_templates
自定義錯誤消息模板。
class User(BaseModel):
age: int
class Config:
error_msg_templates = {
'value_error': 'Invalid value provided.'
}
# user = User(age=-5) # 將拋出驗證錯誤: 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對象填充數(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ù),用于自動生成字段別名。
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模式定義,可以是字典或返回字典的可調用對象。
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
是否在模型驗證時復制繼承的模型。
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
是否在嘗試轉換前檢查所有允許的類型。
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類的各個參數(shù)及其用法。
總結
BaseConfig提供了強大的配置選項,使得Pydantic模型更加靈活和可定制。通過掌握這些配置選項,可以更加高效地進行數(shù)據(jù)驗證和管理。
到此這篇關于Pydantic中BaseConfig的具體使用的文章就介紹到這了,更多相關Pydantic BaseConfig內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
TensorFlow繪制loss/accuracy曲線的實例
今天小編就為大家分享一篇TensorFlow繪制loss/accuracy曲線的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
使用PyWeChatSpy自動回復微信拍一拍功能的實現(xiàn)代碼
這篇文章主要介紹了用PyWeChatSpy自動回復微信拍一拍功能,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
深入分析python數(shù)據(jù)挖掘 Json結構分析
這篇文章通過實例給大家分析總結了python數(shù)據(jù)挖掘以及Json結構分析的相關知識點,對此有興趣的朋友參考下。2018-04-04
Jupyter notebook無法導入第三方模塊的解決方式
這篇文章主要介紹了Jupyter notebook無法導入第三方模塊的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04

