找回密码
 会员注册
查看: 24|回复: 0

pydantic库(Python数据接口定义)基本使用指南

[复制链接]

6

主题

0

回帖

19

积分

新手上路

积分
19
发表于 2024-9-4 11:22:42 | 显示全部楼层 |阅读模式
写在前面前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站文章目录pydantic概述环境准备BaseModel(基本模型)简述pydantic和@dataclass的异同定义BaseModel数据模型BaseModel常用API@validator:自定义验证器BaseSettings:管理配置BaseSettings基类BaseSettings类的Config内部类代码示例pydantic概述pydantic库是python中用于数据接口定义检查与设置管理的库。pydantic在运行时强制执行类型提示,并在数据无效时提供友好的错误。具有如下优点:易于使用:Pydantic很容易安装与使用,并且有一个简单的API,使得所有开发者都可以快速上手使用。快速验证:Pydantic快速有效地执行数据验证,使其适合于在高性能的应用程序中使用。自动生成文档:Pydantic可以为数据模型自动生成文档,节省时间,并且更容易的理解数据结构。类型提示支持:Pydantic支持类型提示,使开发人员更容易定义数据结构,避免在代码中出现错误。与FastAPI集成:Pydantic可以很容易地与FastAPI(一个高性能的Python网络框架)集成,为API提供自动请求和响应验证。自定义验证规则:Pydantic允许开发人员定义自定义的验证规则,使得在需要的时候可以实现复杂的验证逻辑。一致的数据:Pydantic确保项目中使用的数据是一致的,并符合所需的标准,减少了错误的风险,使代码库的维护更加容易。与IDE/linter完美搭配,不需要学习新的模式,只是使用类型注解定义类的实例多用途,BaseSettings既可以验证请求数据,也可以从环境变量中读取系统设置可扩展,可以使用validator装饰器装饰的模型上的方法来扩展验证数据类集成,dataclass装饰器可以创建带有输入数据解析和验证的普通Python数据类。Pydantic的工作方式Pydantic的工作方式是允许开发人员使用Python类来定义数据模型。这些类继承自Pydantic提供的BaseModel类,可以包括类型提示、默认值和验证规则。当收到数据时,Pydantic使用数据模型来验证传入的数据,并确保其符合所定义的要求。在验证过程中,Pydantic对照数据模型中定义的类型提示和验证规则,检查数据中的每个字段。如果数据不符合要求,Pydantic会提出一个错误,并停止验证过程。如果数据是有效的,Pydantic就会创建一个数据模型的实例,用传入的数据来填充它,并将其返回给用户。Pydantic还提供了一些高级功能,例如字段别名,自定义验证函数,以及对嵌套数据模型的支持,使得它可以处理广泛的数据验证场景。此外,Pydantic支持序列化和反序列化,允许根据需要将数据转换为Python数据结构、JSON和其他格式。环境准备安装pydantic命令:pipinstallpydantic测试pydantic是否已编译importpydanticprint('compiled:',pydantic.compiled)12BaseModel(基本模型)简述在Pydantic中,BaseModel是一个用于定义数据模型的基类。它允许创建一个描述数据结构、验证数据和进行数据转换的类。BaseModel基本模型提供了属性和方法来定义字段,校验数据以及序列化数据。BaseModel提供的常用功能有:数据验证:当创建模型实例时,Pydantic会自动验证传入的数据是否满足字段定义的规则。数据转换:Pydantic会尝试将输入数据转换为模型中定义的字段类型,例如将字符串转换为整数或浮点数。自动文档生成:基于模型的字段定义,Pydantic可以自动生成文档和模型验证的错误消息。嵌套模型:可以在模型内部使用其他模型,从而创建复杂的数据结构。序列化和反序列化:允许根据需要将数据转换为Python数据结构、JSON和其他格式。pydantic和@dataclass的异同pydantic和@dataclass都是用于创建数据类(dataclass)的工具,它们有一些相似之处,但也有一些重要的区别。@dataclass:@dataclass是Python标准库中的一个装饰器,自Python3.7引入。它用于创建数据类,可以轻松地定义类的属性,并自动生成常见的特殊方法,如__init__()、__repr__()、__eq__()等。@dataclass不提供数据验证功能,仅用于数据类的创建。适用于简单的数据类,不涉及数据验证或输入的复杂处理逻辑。pydantic:pydantic是一个用于数据验证和数据解析的Python库,它提供了强大的数据验证和输入处理功能。它允许定义模型类,为模型属性添加验证规则,以确保数据的有效性。pydantic支持丰富的验证规则,包括类型检查、最小值、最大值、正则表达式匹配等。适用于需要数据验证和处理的场景,特别是用于处理输入数据、API请求等情况。总结:如果只需要创建简单的数据类,并且不需要进行数据验证和处理,那么使用@dataclass是一个简单而方便的选择。如果需要对输入数据进行验证,确保数据的有效性,或者处理来自外部系统的复杂数据,那么pydantic更适合,因为它提供了更强大的数据验证和处理功能定义BaseModel数据模型在pydantic中定义一个对象模型的主要方法是通过模型继承自BaseModel类,然后声明属性并显式地注解属性的数据类型。属性可以设置默认值,设置了默认值的属性在创建模型对象时可选传参数,否则为必传参数。支持的数据类型包括str、int、float、List等基本数据类型以及其他的Pydantic类型,如EmailStr、UrlStr、PositiveInt等,来增强字段的验证能力。简单示例frompydanticimportBaseModelclassUser(BaseModel):id:intname:str='JaneDoe'#创建对象,传参方式1user=User(id=1)#创建对象,传参方式2item_data={"id":2,"name":'aaa'}user_2=User(**item_data)123456789101112131415BaseModel常用API类属性:model_fields:它包含了模型中每个字段的FieldInfo对象,以字典的形式存储。FieldInfo对象提供了有关字段的详细信息,如字段类型、默认值等。类方法:model_construct():允许在没有验证的情况下创建模型model_validate():用于使用model对象或字典创建模型的实例model_validate_json():用于使用JSON字符串创建模型的实例类对象方法:model_copy():创建模型的一个副本。model_dump():将模型转换为字典,其中包含字段名称和对应的值。model_dump_json():将模型转换为JSON格式的字符串。@validator:自定义验证器@validator装饰器用于在Pydantic的BaseModel子类中定义验证函数,以在模型创建时自动验证字段的值。使用@validator装饰器可以实现自定义验证和对象之间的复杂关系。@validator常用的参数和说明:*fields(可变位置参数):要验证的字段名称,可以是一个或多个字段。这些字段的值将作为验证函数的参数传递给验证函数。传参多个字段需配合allow_reuse参数使用allow_reuse(默认为False):如果设置为True,则允许验证函数重复使用。如果多个字段需要相同的验证逻辑,可以将此参数设置为True以提高代码的复用性。@validator("age","height",allow_reuse=True)1each_item(默认为False):设置验证器是否被施加到单独的值(例如List,Dict,Set等),而不是整个对象pre(默认为False):设置验证函数是在字段验证之前(pre=True)还是之后(pre=False)执行。通常情况下,会将其保留为默认值False,以便在字段验证之后执行验证。pre_root(默认为False):与pre参数一起使用,用于在整个模型层次结构中的字段验证之前或之后执行验证函数。通常情况下,会将其保留为默认值False,以便在字段验证之后执行验证。always(默认为False):如果设置为True,则无论字段是否在模型中被赋值,验证函数都会被执行。通常情况下,会将其保留为默认值False,以便只在字段被赋值时执行验证。注意:验证器是“类方法”,因此它们接收的第一个参数值是类(形参cls),而不是对象(形参self)第二个参数始终是要验证的字段值,可以随意命名,常用v单个验证器可以通过传递多个字段名称来应用于多个字段,也可以通过传递特殊值在所有字段上调用单个验证器代码示例frompydanticimportBaseModel,ValidationError,validatorclassUserModel(BaseModel):name:strnamesist[str]@validator('name')defname_must_contain_space(cls,v):if''notinv:raiseValueError('mustcontainaspace')returnv.title()@validator('names',each_item=True)defcheck_names_not_empty(cls,v):assertv!='','Emptystringsarenotallowed.'returnv12345678910111213141516BaseSettings:管理配置BaseSettings基类BaseSettings是Pydantic提供的一个基类,用于管理应用程序的配置设置。它允许从环境变量、配置文件、命令行参数、Python常量等多个来源加载配置选项,并进行验证和类型转换。BaseSettings的目标是简化配置管理和设置的过程,使得应用程序的配置更加可靠和可维护。基本使用:创建一个继承自BaseSettings的模型,模型初始化程序将自动尝试通过从环境变量中读取,来确定未作为关键字参数传递的任何字段的值(如果未设置匹配的环境变量,则仍将使用默认值)注意:在Pydantic2.3.0版本,BaseSettings的导包路径为(frompydantic.v1importBaseSettings),或使用独立的pydantic-settings包(安装命令:pipinstallpydantic-settings)BaseSettings类的Config内部类在Pydantic的BaseSettings类中,Config内部类提供了一些属性和配置选项,用于自定义配置的行为。可以在Config类中定义这些属性,以影响配置的加载和验证过程。常用的Config配置选项:env_file:指定配置文件(Dotenv文件)的名称。可以是文件名字符串,用于从指定的文件加载配置。pydantic有两种方式加载它:classSettings(BaseSettings):...classConfig:#方式1:Settings.Config类中直接设置默认值env_file='.env'#方式2:实例化BaseSettings子类对象时传参。注意内部类属性在类为传参时加一个下划线(_)settings=Settings(_env_file='prod.env')123456789注意:使用该配置需要python-dotenv包的支持(安装命令:pipinstallpython-dotenv)即使使用dotenv文件,pydantic仍会读取环境变量,环境变量将始终优先于从dotenv文件加载的值。env_prefix:配置环境变量的前缀。设置前缀后,Pydantic将只加载以该前缀开头的环境变量作为配置项。env_file_encoding:指定配置文件的编码。默认是"utf-8"。case_sensitive:设置为True以启用字段名称的大小写敏感性,或设置为False以忽略大小写。默认是False。arbitrary_types_allowed:设置为True以允许在配置文件中使用自定义类型。默认是False。validate_all:是否验证所有字段,而不仅仅是被访问的字段。默认是True。secrets_dir:设置敏感信息文件目录即使使用secrets目录,pydantic仍会从dotenv文件或环境中读取环境变量,环境变量和dotenv文件将始终优先于从secrets目录加载的值。这些是一些常用的Config配置选项,可以通过在Settings类中的Config子类中定义来自定义BaseSettings的行为。代码示例#frompydanticimportBaseSettingsfrompydantic.v1importBaseSettingsclassSettings(BaseSettings):app_name:str="MyApp"api_key:strclassConfig:env_file=".env"#从环境文件加载配置settings=Settings()1234567891011定义了一个名为Settings的BaseSettings子类。在这个类中,声明了两个配置选项:app_name和api_key。app_name有一个默认值,而api_key则需要从配置中加载。Config内部类用于配置BaseSettings的行为。在这个示例中,使用了env_file来指定从名为.env的环境文件中加载配置。通过创建Settings类的实例,可以轻松地访问配置选项,并自动进行验证和类型转换。如果api_key在配置文件中未设置或类型不匹配,Pydantic将引发相应的异常。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-29 12:46 , Processed in 0.562185 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表