【发布时间】:2019-04-14 15:40:06
【问题描述】:
我正在解析 YAML 文件以搜索任意键的值。目前我可以在第一级解析任何字典,但不能解析嵌套字典。
我尝试修改https://stackoverflow.com/a/55608627 的示例以解析列表中的字典,但这会导致错误:
AttributeError: 'CommentedSeq' object has no attribute 'items'
查看http://yaml-online-parser.appspot.com/ 的规范输出时,它显示有一个映射和一个序列,我无法解释。
未修改的解析函数不会输出任何错误,但是它看不到列表中的任何内容。
修改后的解析函数返回上面的AttributeError。
示例 YAML 文件:https://pastebin.com/BhwyPa7V
完整项目:https://github.com/Just-Insane/helm-vault/blob/master/vault.py
解析函数(未修改):
def dict_walker(node, pattern, path=None):
path = path if path is not None else ""
for key, value in node.items():
if isinstance(value, dict):
dict_walker(value, pattern=pattern, path=f"{path}/{key}")
elif value == pattern:
if action == "enc":
node[key] = input(f"Input a value for {path}/{key}: ")
vault_write(node[key], path, key)
elif (action == "dec") or (action == "view") or (action == "edit"):
value = vault_read(path, key)
node[key] = value
解析函数(修改):
def dict_walker(node, pattern, path=None):
path = path if path is not None else ""
for key, value in node.items():
if isinstance(value, dict):
dict_walker(value, pattern=pattern, path=f"{path}/{key}")
elif isinstance(value, list):
for item in value:
for value in dict_walker(value, pattern=pattern, path=f"{path}/{key}"):
if value == pattern:
if action == "enc":
node[key] = input(f"Input a value for {path}/{key}: ")
vault_write(node[key], path, key)
elif (action == "dec") or (action == "view") or (action == "edit"):
value = vault_read(path, key)
node[key] = value
elif value == pattern:
if action == "enc":
node[key] = input(f"Input a value for {path}/{key}: ")
vault_write(node[key], path, key)
elif (action == "dec") or (action == "view") or (action == "edit"):
value = vault_read(path, key)
node[key] = value
预期结果:
嵌套字典被解析,里面的值可以修改成功。
实际结果:
使用未修改的代码,列表内的值根本看不到。
使用修改后的代码,出现
CommentedSeq导致的属性错误。目前尚不清楚为什么它没有被解析为列表。
【问题讨论】: