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?我缺少什么?
因为Pydantic.validators是类方法。
\n\n由于验证器是\xe2\x80\x9c类方法\xe2\x80\x9d,并且这里的完整签名等于\n(cls, value, *, values, config, field)
换句话说,你def quadrant(..., **kwargs):是平等的你config, field
1) 创建自定义配置并从配置中读取
\n\n2) 字段破解
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
10436 次 |
| 最近记录: |