使用 mypy 类型检查 Pydantic BaseModel 作为类型提示

问题描述 投票:0回答:1

我正在使用 pydantic 创建模型并应用数据验证。同时,我想使用这些模型作为类型提示(因为它们包含的信息比简单地说

dict
还要多)。一石二鸟:)

from pydantic import BaseModel, StrictStr, StrictInt

class Person(BaseModel):
    name: StrictStr
    age: StrictInt


def my_func(user: Person) -> None:
    print(user["name"])

但是,mypy 无法正确解析模型,并给出以下错误消息:

error: Value of type "Person" is not indexable  [index]

我希望 mypy 类型检查 pydantic BaseModel 并且不给出错误。

我可以选择创建一个 TypedDict 并将其用作类型提示,但随后我会失去 pydantic 严格功能。

python python-typing mypy pydantic
1个回答
1
投票

所以简短的答案是,您不能在派生自 Pydantic

[]
的类的实例上使用
BaseModel
运算符。

自从您创建了该类以来,您可以简单地使用

Person
获取
person.name
的名称,因此您的函数将如下所示:

 def my_func(user: Person) -> None:
    print(user.name)

如果您需要使用您的

Person
实例作为
dict
,您可以这样做,并且有两种方法。

  1. 将 person 实例传递给
    dict
    构造函数,如
    dict(person)
  2. 您可以调用 person 实例的
    .dict()
    方法,例如:
    person.dict()
    这甚至可以让您执行“部分”类。

要了解更多信息,请查看文档


由于您使用

mypy
并且似乎是 Pydantic 的初学者,我猜您没有安装用于 Pydantic 设置的
mypy
插件。您不需要安装任何东西,因为它随 Pydantic 软件包一起提供。

如果您使用

pyproject.toml
文件(我相信您应该这样做),请将其添加到末尾以启用它。

[tool.mypy]
plugins = [
  "pydantic.mypy"
]

要了解有关该插件的更多信息,您可以查看其docs

© www.soinside.com 2019 - 2024. All rights reserved.