是否可以在不知道实际字段名称的情况下以某种方式初始化pydantic模型



我正在尝试创建某种函数输入输出的动态验证:

from pydantic import ValidationError, BaseModel
import numpy as np
class ValidationImage:
@classmethod
def __get_validators__(cls):
yield cls.validate

@classmethod
def validate(cls, v):
if not isinstance(v, np.ndarray):
raise TypeError("np.ndarray required")
return v

class TestModel(BaseModel):
image: ValidationImage

def validate(msg, model):
try:
message = model(image=msg)
except ValidationError as e:
return e

testimg = np.zeros([0])
print(validate(testimg, TestModel))

但问题是,在这一点上,message = model(image=msg)实际上需要知道模型中有image字段,它是validate函数的自变量。

我想以某种方式创建一个模型实例,而不知道实际的字段名称(可能来自列表?(

我试过message = model(msg)-不起作用。我想知道这是否可能?或者有什么变通办法吗?

更新#1:我可以使用list(model.__fields__.keys())[0]获得字段名称,但我不知道如何使用str作为实际代码。这看起来有点像一个糟糕的做法

我认为您想在这里使用参数扩展:

def validate(args, model):
# `args` must be a dict with str keys.
try:
message = model(**args)
except ValidationError as e:
return e
testimg = np.zeros([0])
print(validate({"image": testimg}, TestModel))

使用kwargs:,您可以获得更高级的体验

def validate(model, **kwargs):
try:
message = model(**kwargs)
except ValidationError as e:
return e
testimg = np.zeros([0])
print(validate(TestModel, image=testimg))

相关内容

最新更新