Как передать kwargs в pydanti c validator? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь написать 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? Чего мне не хватает?

1 Ответ

0 голосов
/ 01 апреля 2020

Потому что Pydanti c .validators являются методами класса здесь.

какой смысл разрешать ** kwargs?

Так как валидаторы являются «методами класса», и полная подпись здесь равна (cls, value, *, values, config, field)

Другими словами, ваш def quadrant(..., **kwargs): равен euqal to config, field

How передать kwargs в pydanti c validator

1) Создать пользовательский config и прочитать из config

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...