【问题标题】:Pydantic type syntax explanationPydantic 类型语法解释
【发布时间】:2021-05-13 23:13:24
【问题描述】:

在下面来自官方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)的解释。

谁能为我解释一下这个语法,当你以这种方式创建一个类时,你如何检查它的含义类型?

提前致谢。

【问题讨论】:

    标签: fastapi pydantic


    【解决方案1】:

    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 就像使用def foo(name: str) 的函数?如果我只是使用它而不在类中创建一个名为 name 的变量 - 这个变量会发生什么?
    • 它可以在你定义变量的任何地方使用。即使是常量,例如:DEFAULT_ID: int = 21.
    【解决方案2】:

    语法“name:str”是 Python 3.6 以上的标准特性。这是一个类型提示,实际上并没有改变 Python 底层的基本行为。该变量可以具有任何值,但这是一个提示,提醒您您打算将其作为字符串。它还允许像 mypy 这样的 linter 标记您正在调用该变量上的方法,这些方法在 str 上不存在,因此很可能在运行时中断。最后,它允许上下文敏感的编辑器预测哪些方法可用,因为它暗示了这是什么类型的变量,而在 Python 中通常不会这样做

    【讨论】:

      【解决方案3】:

      Python 3.5 中,他们引入了类型提示,它遵循特定的语法(参见PEP-484PEP-3107)。

      它指出,

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

      这意味着 Python 不强制执行验证或静态评估,但一些第 3 方库将能够做到这一点。


      来到 Pydatic 的“验证强制技术”,他们编写了如何评估从 BaseModel 继承的类的逻辑

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


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

      【讨论】:

        猜你喜欢
        • 2018-01-11
        • 2021-03-02
        • 1970-01-01
        • 2016-04-07
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多