原文:
www.kdnuggets.com/pydantic-tutorial-data-validation-in-python-made-simple
作者提供的图片
1. 谷歌网络安全证书 - 快速进入网络安全职业道路。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT
Python 是一种动态类型语言。因此,你可以创建变量而无需明确指定数据类型。你也可以随时将完全不同的值赋给同一个变量。虽然这使得初学者更容易上手,但也同样容易在你的 Python 应用程序中创建无效对象。
你可以创建数据类,允许定义带有类型提示的字段。但它们不直接支持数据验证。引入 Pydantic,一个流行的数据验证和序列化库。Pydantic 提供开箱即用的数据验证和序列化支持。这意味着你可以:
-
利用 Python 的类型提示来验证字段,
-
使用 Pydantic 提供的自定义字段和内置验证器,并
-
根据需要定义自定义验证器。
在本教程中,我们将建模一个简单的‘员工’类,并使用 Pydantic 的数据验证功能来验证不同字段的值。让我们开始吧!
如果你有 Python 3.8 或更高版本,你可以使用 pip 安装 Pydantic:
$ pip install pydantic
如果你在应用程序中需要电子邮件验证,可以在安装 Pydantic 时像这样安装可选的 email-validator 依赖:
$ pip install pydantic[email]
或者,你可以运行以下命令安装 email-validator:
$ pip install email-validator
注意:在我们的示例中,我们将使用电子邮件验证。如果你希望跟随代码进行,请安装相应的依赖。
现在让我们创建一个简单的Employee
类。首先,我们创建一个继承自BaseModel
类的类。各种字段和预期类型如下所示:
# main.py
from pydantic import BaseModel, EmailStr
class Employee(BaseModel):
name: str
age: int
email: EmailStr
department: str
employee_id: str
注意,我们已将电子邮件指定为 Pydantic 支持的EmailStr
类型,而不是普通的 Python 字符串。这是因为所有有效的字符串可能不是有效的电子邮件。
因为Employee
类很简单,让我们为以下字段添加验证:
-
email
:应为有效的电子邮件。指定EmailStr
可以满足这个要求,我们在创建具有无效电子邮件的对象时会遇到错误。 -
employee_id
:应为有效的员工 ID。我们将为该字段实现自定义验证。
在这个例子中,假设employee_id
应该是一个长度为 6 的仅包含字母数字字符的字符串。
我们可以使用@validator
装饰器与employee_id
字段作为参数,并定义validate_employee_id
方法,如下所示:
# main.py
from pydantic import BaseModel, EmailStr, validator
...
@validator("employee_id")
def validate_employee_id(cls, v):
if not v.isalnum() or len(v) != 6:
raise ValueError("Employee ID must be exactly 6 alphanumeric characters")
return v
现在,这种方法检查我们尝试创建的 Employee 对象的employee_id
是否有效。
此时,你的脚本应该如下所示:
# main.py
from pydantic import BaseModel, EmailStr, validator
class Employee(BaseModel):
name: str
age: int
email: EmailStr
department: str
employee_id: str
@validator("employee_id")
def validate_employee_id(cls, v):
if not v.isalnum() or len(v) != 6:
raise ValueError("Employee ID must be exactly 6 alphanumeric characters")
return v
在实际操作中,将 API 的 JSON 响应解析为像 Python 字典这样的数据结构是非常常见的。假设我们有一个名为‘employees.json’的文件(在当前目录中),其记录如下:
# employees.json
[
{
"name": "John Doe",
"age": 30,
"email": "[email protected]",
"department": "Engineering",
"employee_id": "EMP001"
},
{
"name": "Jane Smith",
"age": 25,
"email": "[email protected]",
"department": "Marketing",
"employee_id": "EMP002"
},
{
"name": "Alice Brown",
"age": 35,
"email": "invalid-email",
"department": "Finance",
"employee_id": "EMP0034"
},
{
"name": "Dave West",
"age": 40,
"email": "[email protected]",
"department": "HR",
"employee_id": "EMP005"
}
]
我们可以看到,在对应于‘Alice Brown’的第三条记录中,我们有两个无效的字段:email
和employee_id
:
因为我们已经指定电子邮件应为EmailStr
,所以电子邮件字符串将自动进行验证。我们还添加了validate_employee_id
类方法来检查对象是否具有有效的员工 ID。
现在让我们添加代码来解析 JSON 文件并创建员工对象(我们将使用内置的json 模块)。我们还从 Pydantic 中导入ValidationError
类。实际上,我们尝试创建对象,当数据验证失败时处理 ValidationError 异常,并打印出错误:
# main.py
import json
from pydantic import BaseModel, EmailStr, ValidationError, validator
...
# Load and parse the JSON data
with open("employees.json", "r") as f:
data = json.load(f)
# Validate each employee record
for record in data:
try:
employee = Employee(**record)
print(f"Valid employee record: {employee.name}")
except ValidationError as e:
print(f"Invalid employee record: {record['name']}")
print(f"Errors: {e.errors()}")
当你运行脚本时,你应该会看到类似的输出:
Output >>>
Valid employee record: John Doe
Valid employee record: Jane Smith
Invalid employee record: Alice Brown
Errors: [{'type': 'value_error', 'loc': ('email',), 'msg': 'value is not a valid email address: The email address is not valid. It must have exactly one @-sign.', 'input': 'invalid-email', 'ctx': {'reason': 'The email address is not valid. It must have exactly one @-sign.'}}, {'type': 'value_error', 'loc': ('employee_id',), 'msg': 'Value error, Employee ID must be exactly 6 alphanumeric characters', 'input': 'EMP0034', 'ctx': {'error': ValueError('Employee ID must be exactly 6 alphanumeric characters')}, 'url': 'https://errors.pydantic.dev/2.6/v/value_error'}]
Valid employee record: Dave West
正如预期的那样,只有对应于‘Alice Brown’的记录不是有效的员工对象。放大输出的相关部分,你可以看到关于为什么email
和employee_id
字段无效的详细信息。
这是完整的代码:
# main.py
import json
from pydantic import BaseModel, EmailStr, ValidationError, validator
class Employee(BaseModel):
name: str
age: int
email: EmailStr
department: str
employee_id: str
@validator("employee_id")
def validate_employee_id(cls, v):
if not v.isalnum() or len(v) != 6:
raise ValueError("Employee ID must be exactly 6 alphanumeric characters")
return v
# Load and parse the JSON data
with open("employees.json", "r") as f:
data = json.load(f)
# Validate each employee record
for record in data:
try:
employee = Employee(**record)
print(f"Valid employee record: {employee.name}")
except ValidationError as e:
print(f"Invalid employee record: {record['name']}")
print(f"Errors: {e.errors()}")
本教程到此为止!这是一个 Pydantic 的入门教程。希望你了解了建模数据的基础知识,并使用了 Pydantic 提供的内置和自定义验证。本教程中使用的所有代码都在GitHub上。
接下来,你可以尝试在你的 Python 项目中使用 Pydantic,并探索序列化功能。编程愉快!
Bala Priya C** 是一位来自印度的开发者和技术作者。她喜欢在数学、编程、数据科学和内容创作的交汇点工作。她的兴趣和专长领域包括 DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编程和喝咖啡!目前,她正在通过撰写教程、操作指南、评论文章等与开发者社区分享她的知识。Bala 还创建了引人入胜的资源概述和编程教程。**