首页 > 解决方案 > 验证输入字典模式

问题描述

我在 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
    }

}
  1. 包含相同的键
  2. 如果任何值是 dict 检查 dict 是否也具有相同的键
  3. 检查输入字典的值是否在模式范围内。例如,对于键 'mode',输入 dict 的值应来自('mode_1', 'mode_2', 'mode_3'). 对于所有键值对来说都是明智的。
  4. 如果 SCHEMA 中的值的类型是列表,我还想检查输入 dict 中的相应值是否大于 value[0] 且小于 value[1]

我可以考虑用循环来做。但是想不出一个通用的方法来做到这一点。如果我只是遍历两个 dicts 并比较值,如果架构发生变化,我必须重写逻辑。

是否有任何直接的方法来验证架构?

标签: pythondictionarynested

解决方案


你可以试试这个递归函数:

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

推荐阅读