2017-08-04 100 views
0

我有一个应用程序,其中嵌套的Python字典是基于作为API响应获得的JSON文档创建的。例如:根据yaml配置验证对象值

colleagues = [ 
{ "name": "John", 
    "skills": ["python", "java", "scala"], 
    "job": "developer" 
}, 
{ "name": "George", 
    "skills": ["c", "go", "nodejs"], 
    "job": "developer" 
}] 

此字典可以有更多的嵌套级别。 我想要做的是让用户在YAML配置文件中定义他们自己的任意条件(例如,为了找到在他们的技能中具有“python”或其名称为“John”的同事),我将使用它检查Python字典。

我想过让他们配置在YAML文件中的以下方式,但这需要使用exec(),我想避免因安全原因:

constraints: 
    - "python" in colleagues[x]["skills"] 
    - colleagues[x]["name"] == "John" 

其他选项是有这样的什么一个问题,以便用户可以为字典值指定自己的约束?再一次,上面的字典只是一个例子。实际的尺寸和嵌套级别要大得多。

回答

1

您可以使用Lucene查询解析器将"skill:python""name:John"等查询转换为可执行的谓词函数,然后使用这些谓词过滤同事的列表。搜索“python lucene解析器”会出现几个解析选项。

+0

是否有可能使用提取的JSON创建基于该树的树,然后使用类似'“skill:python”'和'“name:John”'的查询来查询树?我只是想确保手动创建树不会有任何开销。 –

+0

是的,使用Python的'json'模块将树转换为一个字典列表,然后使用您在查询中创建的谓词函数筛选出您想要的字典。 – PaulMcG