是否可以在 pydantic 中使用任意键名?

Is it possible to have arbitrary key names in pydantic?

我正在尝试使用 pydantic 模型的任意键名模拟与 typescripts 接口类似的行为,但 运行 遇到了一些问题。

考虑 TS 中的以下内容:

export interface SNSMessageAttributes {
    [name: string]: SNSMessageAttribute;
}

有可能在 pydantic 中实现吗?

这是我的 python 示例代码:

from pydantic import BaseModel, parse_obj_as
from typing import Optional

class Values(BaseModel):
    Value: str
    Type: str

class MessageAttributes(BaseModel):
    ArbitraryKey: Optional[Values]


class Mymodel(BaseModel):
    MessageAttributes: Optional[MessageAttributes]


data = {"MessageAttributes": {"ArbitraryKey": {"Type": "String", "Value": "TestString"}}}

parsed = parse_obj_as(Mymodel, data)

print(parsed.MessageAttributes.ArbitraryKey.Value)
# TestString

在此示例中,属性 ArbitraryKey 可以是任何内容。但我不可能对所有可能的键名进行硬编码。例如,如果键名不是 ArbitraryKey,会怎样?

我知道我可以在 Config 中使用 extra = 'allow,但这不会给出我在使用 parse_obj_as

时可以获得的点语法

我的问题是,如果可能的话,我可以在 pydantic 中为 属性 个名称做类似于 [name: string] 的事情吗?

经过讨论 Github,这正是我所希望的。

from pydantic import BaseModel, parse_obj_as
from typing import Dict, Optional

from pydantic import parse

class Values(BaseModel):
    Value: str
    Type: str


class Mymodel(BaseModel):
    MessageAttributes: Optional[Dict[str, Values]]


data = {"MessageAttributes": {"ArbitraryKey": {"Type": "String", "Value": "TestString"}}}

parsed = Mymodel.parse_obj(data)

print(parsed)
print(parsed.MessageAttributes['ArbitraryKey'].Type)