Pydantic 是一个用于数据建模/解析的 Python 库,具有高效的错误处理和自定义验证机制。截至今天,Pydantic主要用于FastAPI框架中,用于解析请求和响应,因为Pydantic内置了对JSON编码和解码的支持。
本文涵盖以下主题:
BaseModel
Optional
(皮丹蒂克)email-validator
对于 Pydantic 中的数据建模,我们需要定义一个继承自类和字段的类。自定义验证逻辑位于同一模型类中。让我们通过 JSON 解析的简单示例来理解。考虑一个表示用户数据的 JSON。BaseModel
data = {"id":20, "name":"John", "age":42, "dept":"IT"}
对于解析,首先,我们需要导入并声明一个类,它继承自 .BaseModel
UserBaseModel
1 from pydantic import BaseModel
2 from pprint import print
3 data = {"id":20, "name":"John", "age":42, "dept":"IT"}
4 class User(BaseModel):
5 id: int
6 name: str
7 age: int
8 dept: str
User
1、user = User(**data)
2、pprint(user)
User(id=20, name='John', age=42, dept='IT')
类中的属性可以声明为 .如果我们不确定是否存在任何 JSON 字段,我们可以将该特定类型声明为 如果缺少该字段,默认情况下,如果未使用默认值初始化属性,则返回。在示例中,让我们完全删除该字段:User
Optional
Optional
Optional
Nonedept
1 from pydantic import BaseModel
2 from typing import Optional
3 from pprint import pprint
4 data = {"id":20, "name":"John", "age":42}
5 class User(BaseModel):
6 id: int
7 name: str
8 age: int
9 dept: Optional[str]
10 user = User(**data)
11 pprint(user)
字段值为 ,因为它在输入数据中缺失。dept
None
User(id=20, name='John', age=42, dept=None)
在 Pydantic 中,要获得更精细的错误细节,开发人员需要使用 / block。错误类型为 。try
except
pydantic.error_wrappers.ValidationError
在我们的 JSON 数据中,将字段修改为字符串,然后导入 .id
ValidationError
data = {"id":"default", "name":"John", "age":42} 程序 from pydantic import BaseModel, ValidationError from typing import Optional from pprint import pprint data = {"id":"default", "name":"John", "age":42} class User(BaseModel): id: int name: str age: int dept: Optional[str] try: user = User(**data) pprint(user) except ValidationError as error: pprint(error) 错误
ValidationError(model='User', errors=[{'loc': ('id',), 'msg': 'value is not a valid integer', 'type': 'type_error.integer'}]) 该错误可以表示为 JSON,以提高可读性: try: user = User(**data) pprint(user) except ValidationError as error: print(error.json()) 这将返回 JSON: [ { "loc": [ "id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ]
Pydantic 具有用于自定义属性验证的有用装饰器。开发人员需要导入 Pydantic 装饰器并编写我们的自定义验证逻辑;例如,如果字段的长度少于 3 个字符,则会引发错误。validator
name
data = {"id":10, "name":"ab", "age":42} 程序 from pydantic import BaseModel, ValidationError, validator from typing import Optional from pprint import pprint data = {"id":10, "name":"ab", "age":42} class User(BaseModel): id: int name: str age: int dept: Optional[str] @validator('name') def validate_name(cls, name): print('Length of Name:', len(name)) if len (name) < 3: raise ValueError('Name length must be > 3') return name try: user = User(**data) print(user) except ValidationError as e: print(e.json()) 错误 [ { "loc": [ "name" ], "msg": "Name length must be > 3", "type": "value_error" } ]
涵盖电子邮件验证的原因是可以利用 Pydantic 自定义可选库。您需要从模块导入。使用装饰器,我们需要做的就是调用数据。email-validator
validate_email
email_validator
@validatorvalidate_email
data = {"id":20, "name":"Sameer", "age":42, "email":"sameer@abc.com"} 程序 from pydantic import BaseModel, ValidationError, validator, Required from typing import Optional from pprint import pprint from email_validator import validate_email class User(BaseModel): id: int name: str age: int dept: Optional[str] email: str @validator('name') def validateName(cls, name): print('Length of Name:', len(name)) if (len(name) < 3): raise ValueError('Name length must be > 3') return name @validator('email') def validateEmail(cls, email): valid_email = validate_email(email) return valid_email.email try: user = User(**data) pprint(user) except ValidationError as e: print(e.json())
User(id=20, name='Sameer', age=42, dept=None, email='sameer@abc.com')
让我们将 的值更改为不正确:email
email-id
data = {"id":20, "name":"Sameer", "age":42, "email":"sameer"} 它清楚地表明标志丢失了。提供正确的 后,它会按顺序返回所有内容。
Pydantic可以与任何基于Python的框架一起使用,它也支持本机JSON编码和解码。正如我们在整篇文章中所看到的,采用 Pydantic 很简单,它有各种内置类和装饰器,有助于高效的数据建模、验证和错误处理。
标签:Python,编辑,管理,代码,数据,数据建模,分析库,Pydantic 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。