Pydantic的BaseConfig

2024-06-12 00:28
文章标签 pydantic baseconfig

本文主要是介绍Pydantic的BaseConfig,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Pydantic的BaseConfig教程

概述

Pydantic是一个用于数据验证和设置管理的Python库。它可以通过类型注解来自动生成验证和解析逻辑。BaseConfig是Pydantic模型配置的基类,允许用户定制模型的行为和验证规则。

官方文档链接

Pydantic官方文档 - BaseConfig

基础功能

基本配置

BaseConfig提供了许多选项来配置Pydantic模型的行为。下面是一些常用的配置选项:

  • title: 给模型一个标题。
  • anystr_strip_whitespace: 自动去除字符串前后的空白。
  • min_anystr_length: 字符串的最小长度。
  • max_anystr_length: 字符串的最大长度。
  • validate_assignment: 在模型实例创建后进行属性分配时验证。
示例代码
from pydantic import BaseModelclass User(BaseModel):name: strage: intclass Config:title = "User Model"anystr_strip_whitespace = Truemin_anystr_length = 2max_anystr_length = 50validate_assignment = True# 创建模型实例
user = User(name=" John Doe ", age=30)
print(user.name)  # 输出: "John Doe"

在这个例子中,User模型去除了name字段的前后空白,并设置了字符串的最小和最大长度。

进阶功能

自定义验证器

可以在配置类中定义自定义验证器来增加验证逻辑。

from pydantic import BaseModel, validatorclass User(BaseModel):name: strage: intclass 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# 创建模型实例
user = User(name="Jane Doe", age=25)# 赋值时验证
user.age = 30  # 成功
user.age = -5  # 抛出 ValueError: Age must be a positive number

高级教程

配置继承

可以通过继承BaseConfig类创建一个通用的配置类,并在多个模型中复用。

from pydantic import BaseModelclass CommonConfig:anystr_strip_whitespace = Truemin_anystr_length = 2max_anystr_length = 50class User(BaseModel):name: strage: intclass Config(CommonConfig):title = "User Model"class Product(BaseModel):name: strprice: floatclass Config(CommonConfig):title = "Product Model"# 创建模型实例
user = User(name=" John Doe ", age=30)
product = Product(name="  Laptop ", price=999.99)print(user.name)  # 输出: "John Doe"
print(product.name)  # 输出: "Laptop"

通过这种方式,可以将公共配置集中管理,减少重复代码。

参数详解

1. title

为模型指定一个标题。

from pydantic import BaseModelclass User(BaseModel):name: strage: intclass Config:title = "User Model"print(User.schema())  # 输出包含 "title": "User Model"
2. anystr_lower

将所有字符串转换为小写。

class User(BaseModel):name: strclass Config:anystr_lower = Trueuser = User(name="John Doe")
print(user.name)  # 输出: "john doe"
3. anystr_strip_whitespace

去除字符串前后的空白。

class User(BaseModel):name: strclass Config:anystr_strip_whitespace = Trueuser = User(name=" John Doe ")
print(user.name)  # 输出: "John Doe"
4. min_anystr_length

字符串的最小长度。

class User(BaseModel):name: strclass 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: strclass 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

验证所有字段,而不仅仅是提供的数据字段。

class User(BaseModel):name: strage: intclass 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 Extraclass User(BaseModel):name: strclass 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: strclass Config:allow_mutation = Falseuser = User(name="John")
# user.name = "Doe"  # 将抛出验证错误,因为模型不可变
print(user.name)  # 输出: "John"
9. frozen

如果为True,则模型实例将是不可变的(与allow_mutation相同)。

class User(BaseModel):name: strclass Config:frozen = Trueuser = User(name="John")
# user.name = "Doe"  # 将抛出验证错误,因为模型是冻结的
print(user.name)  # 输出: "John"
10. allow_population_by_field_name

是否允许通过字段名称填充数据,而不是别名。

class User(BaseModel):full_name: strclass Config:allow_population_by_field_name = Truefields = {'full_name': 'name'}user = User(name="John Doe")
print(user.full_name)  # 输出: "John Doe"
11. use_enum_values

使用枚举值而不是枚举实例。

from enum import Enumclass Color(Enum):RED = 'red'BLUE = 'blue'class Car(BaseModel):color: Colorclass Config:use_enum_values = Truecar = Car(color=Color.RED)
print(car.color)  # 输出: "red"
12. fields

字段的配置信息,字典形式,键为字段名,值为别名或包含别名及其他配置信息的字典。

class User(BaseModel):name: strclass Config:fields = {'name': {'alias': 'full_name'}}user = User(full_name="John Doe")
print(user.name)  # 输出: "John Doe"
13. validate_assignment

分配新值时验证字段。

class User(BaseModel):age: intclass Config:validate_assignment = Trueuser = User(age=25)
user.age = 30
# user.age = -5  # 将抛出验证错误,因为age必须是正整数
print(user.age)  # 输出: 30
14. error_msg_templates

自定义错误消息模板。

class User(BaseModel):age: intclass 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:passclass User(BaseModel):custom: CustomTypeclass Config:arbitrary_types_allowed = Trueuser = User(custom=CustomType())
print(user.custom)  # 输出: <__main__.CustomType object at 0x...>
16. orm_mode

启用ORM支持,允许从ORM对象填充数据。

class UserOrm:def __init__(self, name):self.name = nameclass User(BaseModel):name: strclass Config:orm_mode = Trueuser_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: strclass Config:getter_dict = CustomGetterDictdata = {'name': 'John Doe'}
user = User.parse_obj(data)
print(user.name)  # 输出: "custom_John Doe"
18. alias_generator

别名生成器函数,用于自动生成字段别名。

class User(BaseModel):full_name: strclass Config:alias_generator = lambda x: x.upper()user = User(FULL_NAME="John Doe")
print(user.full_name)  # 输出: "John Doe"
19. keep_untouched

保持未修改的类型元组。

class SomeType:passclass User(BaseModel):some: SomeTypeclass Config:keep_untouched = (SomeType,)user = User(some=SomeType())
print(user.some)  # 输出: <__main__.SomeType object at 0x...>
20. schema_extra

额外的JSON模式定义,可以是字典或返回字典的可调用对象。

class User(BaseModel):name: strage: intclass 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加载函数。

import jsondef custom_json_loads(value):return json.loads(value)class User(BaseModel):name: strclass Config:json_loads = custom_json_loadsuser = User.parse_raw('{"name": "John Doe"}')
print(user.name)  # 输出: "John Doe"
22. json_dumps

自定义JSON序列化函数。

import jsondef custom_json_dumps(value, **kwargs):return json.dumps(value, **kwargs)class User(BaseModel):name: strclass Config:json_dumps = custom_json_dumpsuser = User(name="John Doe")
print(user.json())  # 输出: {"name": "John Doe"}
23. json_encoders

自定义JSON编码器字典,键为类型或字符串,值为编码函数。

from datetime import datetimeclass User(BaseModel):created_at: datetimeclass 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: strclass Config:underscore_attrs_are_private = Trueuser = User(_private="secret")
print(user.dict())  # 输出: {}
25. copy_on_model_validation

是否在模型验证时复制继承的模型。

class BaseModelWithConfig(BaseModel):class Config:copy_on_model_validation = Trueclass User(BaseModelWithConfig):name: struser = User(name="John")
print(user.name)  # 输出: "John"
26. smart_union

是否在尝试转换前检查所有允许的类型。

from typing import Unionclass User(BaseModel):value: Union[int, str]class Config:smart_union = Trueuser = User(value="123")
print(user.value)  # 输出: "123"

希望这些示例代码能帮助你更好地理解Pydantic中BaseConfig类的各个参数及其用法。

BaseConfig提供了强大的配置选项,使得Pydantic模型更加灵活和可定制。通过掌握这些配置选项,可以更加高效地进行数据验证和管理。

以上就是Pydantic的BaseConfig的详细讲解及代码示例,希望对你有所帮助!

这篇关于Pydantic的BaseConfig的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052675

相关文章

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Pydantic中model_validator的实现

《Pydantic中model_validator的实现》本文主要介绍了Pydantic中model_validator的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录引言基础知识创建 Pydantic 模型使用 model_validator 装饰器高级用法mo

Pydantic 全面指南:从入门到高级应用

Pydantic 简介 1.1 Pydantic 是什么? Pydantic 是一个用于数据验证和设置管理的 Python 库。它通过 Python 类型注解来定义数据模型,并提供了强大的数据验证功能。Pydantic 的主要目标是确保数据在输入和输出时的一致性和有效性。它广泛应用于各种 Python 项目中,特别是在需要处理复杂数据结构和确保数据完整性的场景中。 Pydantic 的核心功

pydantic.errors.PydanticUserError: If you use `@root_validator`

报错 使用langchain时,import langchain时报错内容如下: pydantic.errors.PydanticUserError: If you use `@root_validator` with pre=False (the default) you MUST specify `skip_on_failure=True`. Note that `@root_valida

FastAPI - Pydantic相关应用

参考链接:Pydantic官方文档 文章目录 定义数据模型创建模型实例数据验证数据转换模型转换模型更新模型配置辅助类Field@validator Pydantic 是一个 Python 库,主要用于数据验证和管理。数据验证是指检查数据是否符合预定的规则和格式,比如检查数据类型是否正确,是否缺少必要的字段等。数据管理是指定义数据的结构和行为,比如设置默认

【AI】【Python】pydantic库学习demo

因为工作中学习AI,然后包括看源码,以及看代码都使用到了pydantic库,因此下面是一些最主要的20%,以学会其80%的精髓。 pydantic 库是 python 中用于数据接口定义检查与设置管理的库。 pydantic 在运行时强制执行类型提示,并在数据无效时提供友好的错误。 这个帖子比较全面:pydantic学习教程 必填校验和Schema Json # 学习一些pyd

【Python系列】pydantic版本问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等常用开发工具系列:罗列

LangChain入门:11.Pydantic(JSON)解析器实战

摘要 在数字化营销的浪潮中,自动化内容生成成为了提升效率和用户参与度的利器。本文将详细介绍如何利用LangChain的自然语言处理能力和Pydantic的数据验证特性,构建一个自动化的花店文案生成器。通过这个工具,您可以快速为各种花卉生成吸引人的描述和推荐理由,从而提升营销效果和客户体验。 环境准备 在开始之前,请确保您的Python环境中已安装以下库:langchain_openai、pa

Python 利用Pydantic模块提升开发效率

文章目录 Pydantic 核心概念pydantic 核心功能BaseModel 模型Field 类Config 类基础类型验证必填字段验证长度验证大小验证枚举值验证容器验证自定义验证器嵌套模型JSON 数据导入ORM 数据导入总结 Pydantic 核心概念 Pydantic 是一个数据验证和设置管理库,它的核心概念是数据模型(Model)和验证(Valida

Pydantic官方文档

1. 简介 1.7.1 版本的文档。 使用Python类型注解进行数据验证和设置管理。 Pydantic 在运行时强制执行类型提示,并在数据无效时提供用户友好的错误信息。 定义数据如何表示为纯粹和规范的 Python ,并使用 pydantic 对其进行验证。 1.1 示例: from datetime import datetimefrom typing import List,