什么是 Pydantic?

Pydantic 可以与任何基于 Python 的框架一起使用,它还支持原生 JSON 编码和解码。在这里,了解采用 Pydantic 是多么简单。


Pydantic 是一个用于数据建模/解析的Python库,具有高效的错误处理和自定义验证机制。截至今天,Pydantic 主要用于FastAPI 框架中用于解析请求和响应,因为 Pydantic 具有对JSON编码和解码 的内置支持。

本文涵盖以下主题:

  • 理解BaseModel
  • Optional在 Pydantic
  • Pydantic 中的验证
  • 自定义验证
  • 使用 Pydantic 可选email-validator模块 进行电子邮件验证

基本模型

对于 Pydantic 中的数据建模,我们需要定义一个继承自BaseModel类和字段的类。自定义验证逻辑位于同一个模型类中。让我们通过JSON解析的简单例子来理解。考虑一个表示用户数据的 JSON。

输入

data = {"id":20, "name":"John", "age":42, "dept":"IT"}


对于解析,首先,我们需要导入BaseModel并声明一个类User,该类继承自BaseModel.

Python

from pydantic import BaseModelfrom pprint import printdata = {"id":20, "name":"John", "age":42, "dept":"IT"}class User(BaseModel):    id: int    name: str    age: int    dept: str


接下来,需要从User类中实例化一个对象:

Python

user = User(**data)pprint(user)


输出

User(id=20, name='John', age=42, dept='IT') 


在 Pydantic 中是可选的

类中的属性User可以声明为 type Optional。如果我们不确定是否存在任何 JSON 字段,我们可以将该特定类型声明为Optional,如果该字段缺失,则默认情况下,如果该属性未使用默认值初始化,则Optional返回。None在示例中,让我们dept完全删除该字段:

Python

from pydantic import BaseModelfrom typing import Optionalfrom pprint import pprintdata = {"id":20, "name":"John", "age":42}class User(BaseModel):id: intname: strage: intdept: Optional[str]user = User(**data) pprint(user)


输出

dept字段值为,None因为它在输入数据中缺失。

User(id=20, name='John', age=42, dept=None)


Pydantic 中的验证

在 Pydantic 中,为了获得更精细的错误细节,开发人员需要使用try/except块。错误将是类型pydantic.error_wrappers.ValidationError

在我们的 JSON 数据中,将id字段修改为字符串,然后导入ValidationError.

输入数据

data = {"id":"default", "name":"John", "age":42}


程序

Python

from pydantic import BaseModel, ValidationErrorfrom typing import Optionalfrom pprint import pprintdata = {"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:

Python

try:    user = User(**data)    pprint(user)except ValidationError as error:    print(error.json())


这将返回 JSON:

JSON

[  {    "loc": [      "id"    ],    "msg": "value is not a valid integer",    "type": "type_error.integer"  }]


自定义验证

Pydantic 具有用于自定义属性验证的有用装饰器。开发者需要导入 Pydanticvalidator装饰器,编写我们自定义的验证逻辑;例如,如果name字段的长度小于 3 个字符,则会引发错误。

输入数据

data = {"id":10, "name":"ab", "age":42}


程序

Python

from pydantic import BaseModel, ValidationError, validatorfrom typing import Optionalfrom pprint import pprintdata = {"id":10, "name":"ab", "age":42}class User(BaseModel):id: intname: strage: intdept: 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 nametry:user = User(**data)print(user)except ValidationError as e: print(e.json())


错误

JSON

[  {    "loc": [      "name"    ],    "msg": "Name length must be > 3",    "type": "value_error"  }]


电子邮件验证

涵盖电子邮件验证的原因是可以利用 Pydantic 自定义可选email-validator库。您将需要validate_emailemail_validator模块导入。使用@validator装饰器,我们需要做的就是调用validate_email数据。

输入数据

data = {"id":20, "name":"Sameer", "age":42, "email":"sameer@abc.com"}


程序

Python

from pydantic import BaseModel, ValidationError, validator, Requiredfrom typing import Optionalfrom pprint import pprintfrom email_validator import validate_emailclass 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.emailtry:    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"}


错误

JSON

[  {    "loc": [      "email"    ],    "msg": "The email address is not valid. It must have exactly one @-sign.",    "type": "value_error.emailsyntax"  }]


它清楚地表明该@标志丢失。提供正确的 后email-id,它会按顺序返回所有内容。

结论

Pydantic 可以与任何基于 Python 的框架一起使用,它还支持原生 JSON 编码和解码。正如我们在整篇文章中看到的那样,采用 Pydantic 很简单,它具有各种内置类和装饰器,有助于高效的数据建模、验证和错误处理。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章