首页 > 解决方案 > 如何将 kwargs 传递给 pydantic 验证器

问题描述

我正在尝试编写pydantic验证器,但我似乎无法理解如何使用kwargs文档中提到的参数。我想传递条件参数进行验证。这是一个玩具示例:

from pydantic import validator
import pydantic.dataclasses as pyd_dc


@pyd_dc.dataclass
class Point_t:
    x: int = 0
    y: int = 1

    @validator("y")
    def quadrant(cls, val, values, **kwargs):
        pt = x, y = values.get("x", None), val
        if x is None:
            raise ValueError(f"invalid point: {x}, {y}")

        signs = kwargs.get("signs", None)
        if signs is None:
            raise ValueError("'signs' parameter missing")

        if all(c * s >= 0 for c, s in zip(pt, signs) if s != 0):
            return val

        raise ValueError(f"{pt} not in quadrant: {signs}")

这似乎不起作用,实例化一个Point_t对象会导致验证错误:

ValidationError: 1 validation error for Point_t
y
  'signs' parameter missing (type=value_error)

如何传递signs上面示例中的参数?如果没有办法,允许有什么意义**kwargs?我错过了什么?

标签: python-3.xvalidationpython-dataclassespydantic

解决方案


因为Pydantic.validators是这里的类方法

允许 **kwargs 有什么意义?

由于验证器是“类方法”,这里的完整签名等于 (cls, value, *, values, config, field)

换句话说,def quadrant(..., **kwargs):等于config, field

如何将 kwargs 传递给 pydantic 验证器

1)创建自定义配置并从配置中读取

2) 字段破解

class Point_t:
    signs = dict
    x: int = 0

    def quadrant(cls, val, values, **kwargs):
        signs = values[signs]
        if signs is None:
            raise ValueError("'signs' parameter missing")

        if all(c * s >= 0 for c, s in zip(pt, signs) if s != 0):
            return val


推荐阅读