【问题标题】:Is it possible to somehow initialize pydantic model without knowing the actual field names?是否可以在不知道实际字段名称的情况下以某种方式初始化 pydantic 模型?
【发布时间】:2022-01-18 18:49:18
【问题描述】:

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

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 作为实际代码。而且这似乎是一种不好的做法

【问题讨论】:

    标签: python pydantic


    【解决方案1】:

    我想你想在这里使用参数扩展:

    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))
    

    【讨论】:

    • 很遗憾没有。任务本身要求我使用一个论点,并且只使用一个论点(而不是 kwarg)。我找到了一种不同的方法来完成这项任务,不需要使用这种类型的东西,但我仍然认为这是一个好问题
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多