簡體   English   中英

是否可以在不知道實際字段名稱的情況下以某種方式初始化 pydantic model?

[英]Is it possible to somehow initialize pydantic model without knowing the actual field names?

我正在嘗試對 function 的輸入輸出創建某種動態驗證:

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)我實際上確實需要知道 model 內部有image字段,這是我作為validate function 的參數得到的。

我想以某種方式創建一個 model 實例而不知道實際的字段名稱(可能來自列表?)

我試過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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM