Я уже несколько месяцев работаю с парсером PyYAML, чтобы преобразовывать типы файлов как часть конвейера данных. Я обнаружил, что синтаксический анализатор временами ведет себя весьма своеобразно, и, похоже, сегодня я наткнулся на еще одно странное поведение. Файл, который я сейчас конвертирую, содержит следующий раздел:
Код: Выделить всё
off:
yes: "Flavor text for yes"
no: "Flavor text for no"
Я сохраняю список текущих вложений в словаре, чтобы можно было создать простой документ, но сохраняю вложения для последующего преобразования обратно в YAML. Я получил ошибку TypeError, сообщающую, что я пытался объединить типы str и bool. Я исследовал и обнаружил, что PyYaml на самом деле берет мой фрагмент текста выше и преобразует его в следующее:
Код: Выделить всё
with open(filename, "r") as f:
data = yaml.load(f.read())
print data
>> {False: {True: "Flavor text for yes", False: "Flavor text for no}}
Я быстро проверил и обнаружил, что PyYAML делает это для да, нет, true, ложь, вкл., выкл.. Это преобразование выполняется только в том случае, если ключи не заключены в кавычки. Цитированные значения и ключи будут переданы нормально. В поисках решения я нашел такое поведение, описанное здесь.
Хотя другим может быть полезно узнать, что цитирование ключей не позволит PyYAML сделать это, у меня нет этой опции, поскольку я не автор этих файлов и написал свой код, чтобы как можно меньше затрагивать данные.
Есть ли способ обойти эту проблему или способ переопределить поведение преобразования по умолчанию в PyYAML?
Подробнее здесь:
https://stackoverflow.com/questions/364 ... ean-values