我jsonschema用來驗證 JSON 檔案,如果有任何錯誤我需要捕獲它們,包括檔案中錯誤的路徑。為了確保路徑永遠不會為空(即,如果缺少檔案根目錄中的必需鍵),我希望在路徑前面加上root錯誤。
v = jsonschema.Draft7Validator(schema_dict)
errors = sorted(v.iter_errors(payload_dict), key=lambda e: e.path)
if len(errors) > 0:
paths = ['.'.join(deque(('root')) e.absolute_path) for e in errors]
messages = [f'{p}: {e.message}' for e, p in zip(errors, paths)]
raise InvalidPayloadException(messages) from None
例如,如果屬性obj.key1和obj.key2是必需的,并且測驗了以下 JSON 檔案。
{
"obj": {
"keyx": "value"
}
}
我希望messages包含的是以下串列。
["root.obj: 'key1' is a required property", "root.obj: 'key2' is a required property"]
messages實際上包含的是根作為四個獨立的元素。
["r.o.o.t.obj: 'key1' is a required property", "r.o.o.t.obj: 'key2' is a required property"]
如何修改我的代碼以使訊息包含預期的文本?最好是,我想保留一個串列理解,因為它們往往非常易讀并且不占用太多空間,但如果需要,我愿意改變它。
我還看到了deque提到的檔案appendleft(),但是使用它會導致錯誤。
paths = ['.'.join(e.absolute_path.appendleft('root')) for e in errors]
TypeError:“NoneType”物件不可迭代
uj5u.com熱心網友回復:
因此,問題是您將單個字串物件傳遞給dequeue建構式,它的作業方式與 Python 中其他類似序列的建構式一樣,它接受任意可迭代物件并通過迭代可迭代物件來構造出隊。
但我注意到你使用了一組額外的括號,所以我認為你的意思是傳遞一個單例元組。你實際上需要一個逗號,所以你想要的是:
paths = ['.'.join(deque(('root',)) e.absolute_path) for e in errors]
注意逗號。deque(('root'))->deque(('root',))
不過,我認為這樣做會更干凈:
paths = ['.'.join(['root', *e.absolute_path]) for e in errors]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/478852.html
標籤:Python 收藏品 jsonschema
上一篇:在Python中比較“xisnoty”與“xis(noty)”的操作順序發生了什么?
下一篇:Python腳本簡化
