python-3.x - 如何将 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
?我错过了什么?
解决方案
因为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
推荐阅读
- android - 使用重复动画时退出时颤振崩溃?
- python - 如何访问存储在字典中的元组中的元素?
- c++ - 由于 Visual Studio 次要升级而导致的运行时依赖性
- python - 使用 Tkinter 显示图像
- github - Github:一个问题可以只分配给一个特定的分支吗?
- firebase - Firestore 多范围查询
- php - 只有主页适用于 localhost 版本的 Wordpress
- java - 设计模式特例
- forms - 如何在Vuejs2中清除material-ui md-field组件?
- c++ - 在 C++ 中构造一个“is_template_instantiable”类型特征