如何解决Pydantic 类型语法解释
在下面来自官方 FastAPI
tutorials page 的代码中,我无法理解语句(例如 name: str
)。
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
我的意思是,我知道他们应该强制执行类型,但是他们究竟应该怎么做,因为 python 不强制执行类型。
- 我还看到了 Pydantic 手册,但在类声明中没有看到有关此特定语法(例如
name: str
)的解释。
谁能帮我解释一下这个语法,当你以这种方式创建一个类时,你如何检查它的类型?
提前致谢。
解决方法
Python 的输入行为
Python 3.5 以上支持打字:https://docs.python.org/3/library/typing.html。 如果您的类型提示不正确,您的代码仍将运行 - 正如文档所说:它只是一个类型提示。 Python 仍然是一种动态类型语言。 但是,您可以使用 MyPy 在运行之前捕获这些错误。
Pydantic 的输入行为
尽管了解 Pydantic 的行为也很重要:如果您的类型不是 str,但可以进行转换,它将首先转换为字符串,而不会出现任何错误消息。否则会报错。
如果您想强制引发错误而不进行转换,您应该使用 Pydantic 严格类型:https://pydantic-docs.helpmanual.io/usage/types/#strict-types
但这里是 Pydantic 文档告诉你的: “[...] 仅注释声明告诉 pydantic 该字段是必需的。如果可能,字符串、字节或浮点数将被强制转换为整数;否则将引发异常。” (https://pydantic-docs.helpmanual.io/)
,“name:str”语法是 Python 3.6 以上的标准特性。这是一个类型提示,实际上并没有改变 Python 底层的基本行为。该变量可以有任何值,但这是一个提示,提醒您您希望它是一个字符串。它还允许像 mypy 这样的 linter 标记您正在调用此变量上不存在于 str 上的方法,因此可能会在运行时中断。最后,它允许上下文敏感的编辑器预测哪些方法可用,因为它暗示了这是什么类型的变量,而在 Python 中通常不会
,在 Python 3.5 中,他们引入了类型提示,它遵循特定的语法(参见 PEP-484 和 PEP-3107)。
它指出,
PEP 3107 引入了函数注释的语法,但语义故意未定义。现在已经有足够多的 3rd 方使用静态类型分析,社区将从标准库中的标准词汇表和基线工具中受益。
这意味着 Python 不会强制执行验证或静态评估,但某些 3rd 方库可以执行此操作。
来到 Pydatic 的“验证执行技术”,他们编写了如何评估继承自 BaseModel
他们一直在从 __init__(...)
方法本身调用验证器,因此如果输入数据不满足定义的验证条件,您将收到 ValidationError
异常.
简而言之,Pydatic 的 BaseModel
是一个普通的 Python 类,它采用 __init__(...)
参数并根据定义的类变量进行验证。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。