python - 验证输入字典模式
问题描述
我在 Python 中有一个输入字典的模式,如下所示,
SCHEMA = {
'mode': ('mode_1', 'mode_2', 'mode_3'),
'method': ('method_1', 'method_2'),
'other': {
'x1': [1, 365],
'x2': [0., 1.0]
}
}
我想验证给定的输入字典,
inp = {
'mode': 'mode_1',
'method': 'method_1',
'other': {
'x1': 1,
'x2': 1.0
}
}
- 包含相同的键
- 如果任何值是 dict 检查 dict 是否也具有相同的键
- 检查输入字典的值是否在模式范围内。例如,对于键 'mode',输入 dict 的值应来自
('mode_1', 'mode_2', 'mode_3')
. 对于所有键值对来说都是明智的。 - 如果 SCHEMA 中的值的类型是列表,我还想检查输入 dict 中的相应值是否大于 value[0] 且小于 value[1]
我可以考虑用循环来做。但是想不出一个通用的方法来做到这一点。如果我只是遍历两个 dicts 并比较值,如果架构发生变化,我必须重写逻辑。
是否有任何直接的方法来验证架构?
解决方案
你可以试试这个递归函数:
def validate(input_, db):
for k,v in input_.items():
if isinstance(v, dict):
return validate(v, db.get(k))
else:
if v not in db.get(k):
return False
return True
然后你叫它:
In [21]: validate(inp, SCHEMA)
Out[21]: True
如果您将输入更改为:
In [16]: inp = {
...: 'mode': 'mode_2',
...: 'method': 'method_2',
...: 'other': {
...: 'x1': 4, # This is not valid
...: 'x2': 1.0
...: }
...:
...: }
In [17]: validate(inp, SCHEMA)
Out[17]: False
或者
In [20]: inp = {
...: 'mode': 'mode_2',
...: 'method': 'method_2',
...: 'other': {
...: 'x1': 1,
...: 'x2': 1.0
...: }
...:
...: }
In [21]: validate(inp, SCHEMA)
Out[21]: True
推荐阅读
- r - 用 dplyr 中的数学条件进行总结
- xamarin - Xamarin iOS 部署的 Info.plist 中的“需要全屏”和“支持多个窗口”选项是什么?
- asp.net-mvc - 如何将参数传递给 RedirectToAction 到另一个 Action?
- azure - 两个 Azure 虚拟机规模集 (VMSS) 之间的负载平衡
- python - PyQt5 QGraphicsSimpleTextItem Y 位置
- c# - Asp .NET Core SignalR 显示服务器时间
- c++ - 为什么在编译 x86_64 时 int 被视为 32 位值
- javascript - 如何修改此脚本以使其在页面首次加载和更改时工作?
- python - 如何将嵌套字典写入 CSV 文件?
- python - Pythonic(OO)根据对象类型选择类方法的方式