Я разбираю файл 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
. Непонятно, почему он не анализируется как список.