允许 BaseModel pydantic 的位置参数

7 python pydantic

我有一个包含所有必要参数的类。但是,对于init函数,它要求关键字参数,并且不接受位置参数。所以,我的问题是:我可以在 pydantic.BaseModel 的配置中更改一些内容以允许位置参数吗?

这是我的班级的一个例子:

class Foo(BaseModel):
    a: int
    b: Optional[str]
    c: Optional[float]
Run Code Online (Sandbox Code Playgroud)

当我初始化该类时,我需要传递关键字参数: 类参数的图像

所以,我无法像这样初始化该类:

Foo(1,2,2.5)
# instead, I should init it like this:
Foo(a=1,b=2,c=2.5)
Run Code Online (Sandbox Code Playgroud)

因此,我需要能够将位置关键字传递给类。是否可以?

Ars*_*dev 6

__init__在 pycharm 中使用的带有类型提示的覆盖方法示例

class Foo(BaseModel):
    a: int
    b: Optional[str]
    c: Optional[float]
    
    def __init__(self, a: int,
                 b: Optional[str] = None,
                 c: Optional[float] = None,
                 **kwargs) -> None:
        super(Foo, self).__init__(a=a, b=b, c=c, **kwargs)
Run Code Online (Sandbox Code Playgroud)


Bas*_*n B 1

Pydantic 对象不支持位置参数,除非您按照 Arseniy Lebedev 建议的那样自己实现它。

这是为什么 ?以下是一些原因

  • 当你有很多字段时 - 很容易将另一个字段添加到模型中,突然所有假设字段具有给定位置的代码都会默默地中断
  • 仅注释字段意味着 pydantic 模型字段的顺序与代码中的顺序不同。
import json
from pydantic import BaseModel
from typing import Optional

class Foo(BaseModel):
    a: int
    b: Optional[str]
    c: Optional[float]
Run Code Online (Sandbox Code Playgroud)

您可以为 Pydantic 提供您想要用来初始化模型的每个密钥(您所做的):

Foo(a=1,b="2",c=2.5)
Run Code Online (Sandbox Code Playgroud)

或者你可以使用 json:

json_raw = '{"a": 1, "b": "2", "c": 3}'
some_dict = json.loads(json_raw)
my_foo = Foo(**some_dict)
Run Code Online (Sandbox Code Playgroud)

或两者的混合:

json_raw = '{"a": 1, "b": "2"}'
some_dict = json.loads(json_raw)
my_foo = Foo(**some_dict, c=3)
Run Code Online (Sandbox Code Playgroud)

  • 我找到了解决方法,我在类中创建了一个 init 函数,它将获取所有位置参数并使用 pydantic.BaseModel 中的 __fields__ 将其转换为关键字参数。但是,对于我的 init 函数,不显示类型提示...我可以解决这个问题吗? (2认同)