3

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ですか? 私は何が欠けていますか?

4

2 に答える 2

5

ここでは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

于 2020-04-01T03:48:16.377 に答える