微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pydantic 类型语法解释

如何解决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-484PEP-3107)。

它指出,

PEP 3107 引入了函数注释的语法,但语义故意未定义。现在已经有足够多的 3rd 方使用静态类型分析,社区将从标准库中的标准词汇表和基线工具中受益。

这意味着 Python 不会强制执行验证或静态评估,但某些 3rd 方库可以执行此操作。


来到 Pydatic 的“验证执行技术”,他们编写了如何评估继承自 BaseModel

的类的逻辑

他们一直在从 __init__(...) 方法本身调用验证器,因此如果输入数据不满足定义的验证条件,您将收到 ValidationError 异常.


简而言之,Pydatic 的 BaseModel 是一个普通的 Python 类,它采用 __init__(...) 参数并根据定义的类变量进行验证。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。