Использование конфигурации YAML с отступом от табуляции

#python #yaml

#python #yaml

Вопрос:

Я писал модульный тест и обнаружил инструмент, который записывает конфигурацию YAML с отступом табуляции, но когда я попытался прочитать его с помощью yaml.load(file_object) , я получаю сообщение об ошибке:

 (<unknown>): found character that cannot start any token while scanning for the next token at line 2 column 1
  

или с помощью инструмента, который я вижу в терминале:

 while scanning for the next token
found character 't' that cannot start any token
  in "/user/config/settings", line 2, column 1
  

Комментарии:

1. Отступ табуляции в YAML запрещен (см. 6.1 Пробелы для отступов в спецификации: «Для обеспечения переносимости символы табуляции не должны использоваться в отступах, поскольку разные системы обрабатывают вкладки по-разному»). В чем именно заключается ваш вопрос?

2. ну, я прочитал документацию yaml, и в ней не было сказано, что она разрешает tab, однако я наткнулся на инструмент PyQt UI, который записывает файл yaml, предназначенный для tab, и мой код, пытающийся проверить конфигурацию пользователя, выдает ошибку выше. Вы ответили на мой вопрос, однако поддерживалось ли когда-либо наличие tab в некоторых старых версиях yaml?

3. Это удивительно, я бы сказал, что это ошибка в инструменте, о которой можно сообщить. Похоже, что отступ табуляции был запрещен со времен самой старой исторической версии спецификации . Стандартные библиотеки YAML делают это правильно, поэтому я полагаю, что это плохая пользовательская генерация YAML. Я думаю, что многие случаи (не уверен, что все) можно было бы «исправить», заменив начальные табуляции фиксированным количеством пробелов.

Ответ №1:

Хотя символы табуляции допустимы в YAML, они не могут использоваться для отступов ни в текущей версии (1.2, ни в более старой 1.1 или 1.0)

Это не означает, что табуляция не может появляться в начале строки, как показано в следующем примере

 import sys
import ruamel.yaml

yaml_str = """
'xxx
tyyy'
"""

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(yaml_str)
print(data)
  

которая выполняется без ошибок и выдает:

 xxx yyy
  

однако, если вы удалите одинарные кавычки из yaml_str , вы
получите полученную ошибку (в строке 2, столбец 1), поскольку анализатор
необходимо учитывать, запускает ли yyy новый токен (при сканировании единственного
скалярный код в кавычках этого не делает).

Не видя фактического YAML, трудно сказать точно, но, вероятно, виноват ваш инструмент. Вам может сойти с рук замена табуляций:

 with open('yourfile.yaml') as fp:
    data = yaml.load(fp.read().replace('t', ' '))