【发布时间】:2020-11-26 01:37:22
【问题描述】:
我正在尝试使用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 可以是任何东西。但我不可能对所有可能的键名进行硬编码。例如,如果密钥名称是 SomeTestKey,而不是 ArbitraryKey,该怎么办?
我知道我可以在Config 中使用extra = 'allow,但这不会给出我在使用parse_obj_as 时可以获得的点语法
我的问题是,如果可能的话,我可以在 pydantic 中为属性名称做类似于[name: string] 的事情吗?
【问题讨论】:
-
我认为custom root type 可以做到,但work as expected 不行