我正在使用 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 严格功能。
所以简短的答案是,您不能在派生自 Pydantic
[]
的类的实例上使用 BaseModel
运算符。
自从您创建了该类以来,您可以简单地使用
Person
获取 person.name
的名称,因此您的函数将如下所示:
def my_func(user: Person) -> None:
print(user.name)
如果您需要使用您的
Person
实例作为dict
,您可以这样做,并且有两种方法。
dict
构造函数,如 dict(person)
.dict()
方法,例如: person.dict()
这甚至可以让您执行“部分”类。要了解更多信息,请查看文档
由于您使用
mypy
并且似乎是 Pydantic 的初学者,我猜您没有安装用于 Pydantic 设置的 mypy
插件。您不需要安装任何东西,因为它随 Pydantic 软件包一起提供。
如果您使用
pyproject.toml
文件(我相信您应该这样做),请将其添加到末尾以启用它。
[tool.mypy]
plugins = [
"pydantic.mypy"
]
要了解有关该插件的更多信息,您可以查看其docs