如何将 kwargs 传递给 pydantic 验证器

suv*_*ayu 4 validation python-3.x python-dataclasses pydantic

我正在尝试编写pydanticvalidators,但我似乎无法理解如何使用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}")
Run Code Online (Sandbox Code Playgroud)

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

ValidationError: 1 validation error for Point_t
y
  'signs' parameter missing (type=value_error)
Run Code Online (Sandbox Code Playgroud)

signs上例中的参数如何传递?如果没有办法,允许又有什么意义呢**kwargs?我缺少什么?

Tyl*_*ler 5

因为Pydantic.validators类方法

\n\n

允许 **kwargs 有什么意义?

\n\n

由于验证器是\xe2\x80\x9c类方法\xe2\x80\x9d,并且这里的完整签名等于\n(cls, value, *, values, config, field)

\n\n

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

\n\n

如何将 kwargs 传递给 pydantic 验证器

\n\n

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

\n\n

2) 字段破解

\n\n
class Point_t:\n    signs = dict\n    x: int = 0\n\n    def quadrant(cls, val, values, **kwargs):\n        signs = values[signs]\n        if signs is None:\n            raise ValueError("\'signs\' parameter missing")\n\n        if all(c * s >= 0 for c, s in zip(pt, signs) if s != 0):\n            return val\n\n
Run Code Online (Sandbox Code Playgroud)\n