2017-08-04 51 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