具有以下 python 类型定义:
import pydantic
from typing import List, Union
import sys
import pprint
class TypeA(pydantic.BaseModel):
name:str = "Type A"
type_a_spesific:float = 1337
class TypeB(pydantic.BaseModel):
name:str = "Type B"
type_b_spesific:str = "bob"
class ReturnObject(pydantic.BaseModel):
parameters:List[Union[TypeA, TypeB] ]
parameters = list()
parameters.append(TypeA(name="item 1", type_a_spesific=69))
parameters.append(TypeB(name="item 2", type_b_spesific="lol"))
ret = ReturnObject(parameters = parameters)
print(f"Python version: {pprint.pformat(sys.version_info)}")
print(f"Pydantic version: {pydantic.__version__}")
print(ret.json(indent=3))
print(ret)
版本输出如下所示:
Python version: sys.version_info(major=3, minor=11, micro=5, releaselevel='final', serial=0)
Pydantic version: 1.10.11
我希望参数列表包含两个不同类型的对象,如下所示:
{
"parameters": [
{
"name": "item 1",
"type_a_spesific": 69
},
{
"name": "item 2",
"type_b_spesific": "lol"
}
]
}
parameters=[TypeA(name='item 1', type_a_spesific=69.0), TypeB(name='item 2', type_b_spesific="lol")]
然而,结果却是这样的:
{
"parameters": [
{
"name": "item 1",
"type_a_spesific": 69.0
},
{
"name": "item 2",
"type_a_spesific": 1337
}
]
}
parameters=[TypeA(name='item 1', type_a_spesific=69.0), TypeA(name='item 2', type_a_spesific=1337)]
由于某种原因,List[ Union[ TypeA, TypeB ]] 不起作用。 什么给予?
感谢@juanpa.arrivilillaga的评论,我自己找到了答案;
这是 Pydantic 1.x 的一个错误(功能?)。如果我升级到使用 Pydantic 2.x 那么它的行为将按预期进行。