python yaml load_all получает неправильные ключи - PullRequest
0 голосов
/ 30 мая 2020

yaml.load all требует пробела после ":", чтобы распознать правильный ключ. Если он не найдет пространство, он будет использовать всю пару значений ключа в качестве ключа, а затем присвоить None в качестве значения.

См. Ниже: OP print имеет 'B2_key: B2_VAL': None

test_item = "A1: {B1_key: b1_val, B2_key:B2_VAL}"
yaml_iterator = yaml.load_all(test_item, Loader=yaml.Loader)
op = {}
for item in yaml_iterator:
    op.update(item)
print(op)

Output print: {'A1': {'B1_key': 'b1_val', 'B2_key:B2_VAL': None}}

Я так понимаю, мы можем просто иметь IP-файл в правильном формате. Но есть ли способ справиться с этим? Я хочу, чтобы пользователи не заботились о пробелах.

Одним из способов может быть проверка OP dict и обработка его там.

Пожалуйста, посоветуйте лучший способ справиться с этим. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Синтаксис YAML явно указывает, что за двоеточием должен следовать пробел. Таким образом, у вас есть два варианта:

  1. Требовать от пользователей писать в YAML (даже если это означает, что они должны добавлять пробел после двоеточия при указании ключей); или,
  2. Используйте наполовину продуманный формат, несколько напоминающий YAML, для которого у вас еще нет встроенного парсера и который не позволяет использовать ключи с двоеточием в них.

Go с опцией 1 .

0 голосов
/ 30 мая 2020

Если вы действительно не хотите, чтобы ваши пользователи заботились о синтаксисе и у вас есть yaml в строке, вы можете добавить пробелы после точки с запятой:

test_item = test_item.replace(':', ': ')

Вывод:

{'A1': {'B1_key': 'b1_val', 'B2_key': 'B2_VAL'}}

Но это будет работать, только если точки с запятой не разрешены в ключах и значениях.

...