#python #ruby #yaml
#python #ruby #yaml
Вопрос:
Кто-нибудь знает, почему это yaml анализируется и правильно читается моим приложением
development:
autocreate_indexes: false
allow_dynamic_fields: true
include_root_in_json: false
parameterize_keys: true
persist_in_safe_mode: false
raise_not_found_error: true
reconnect_time: 3
uri: mongodb://app:app@flame.mongohq.com:27076/app1
Но этот yaml не
defaults: amp;defaults
autocreate_indexes: false
allow_dynamic_fields: true
include_root_in_json: false
parameterize_keys: true
persist_in_safe_mode: false
raise_not_found_error: true
reconnect_time: 3
development:
<<: *defaults
uri: mongodb://app:app@flame.mongohq.com:27076/app1
В прошлом у меня несколько раз возникала эта проблема, и я бы удалил синтаксис ярлыка в качестве обходного пути, но на этот раз я работаю с большим приложением, и оно использует этот синтаксис повсеместно, поэтому я не могу его легко преобразовать.
Я никогда не получаю ошибку синтаксического анализа yaml, я просто получаю различные ошибки позже в стеке вызовов, когда значения, от которых зависело приложение, не найдены.
Моя среда:
ubuntu 11.04
python 2.7.1
ruby 1.9.2-p180 под rvm
Дайте мне знать, если вам понадобится что-нибудь еще, чтобы разобраться в этом.
Обновить
Когда я удаляю сокращенный синтаксис в этом файле, я получаю следующую ошибку:
psych.rb:148:in `parse': couldn't parse YAML at line 7 column 19 (Psych::SyntaxError)
Комментарии:
1. Может быть, вы не можете использовать одно и то же имя для узла и ссылки (
defaults: amp;defaults
)?2. Однако это всего лишь один конфигурационный файл высокого уровня. В зависимых gems есть много других мест, которые делают то же самое.
3. Похоже, он работает так, как я ожидал в Ruby 1.8.7. Не могли бы вы, пожалуйста, добавить неправильно проанализированную структуру данных к вашему вопросу? Используйте ‘pp’, чтобы распечатать его, если это возможно.
Ответ №1:
Решением было добавить следующее в мой boot.rb
require 'yaml'
YAML::ENGINE.yamler= 'syck'
Ответ №2:
PyYAML, кажется, разбирает его нормально:
>>> yaml.load(s)
<<<
{'defaults': {'allow_dynamic_fields': True,
'autocreate_indexes': False,
'include_root_in_json': False,
'parameterize_keys': True,
'persist_in_safe_mode': False,
'raise_not_found_error': True},
'development': {'allow_dynamic_fields': True,
'autocreate_indexes': False,
'include_root_in_json': False,
'parameterize_keys': True,
'persist_in_safe_mode': False,
'raise_not_found_error': True,
'uri': 'mongodb://app:app@flame.mongohq.com:27076/app1'},
'e': 3}
Вы не указали, где / как вы загружали yaml, но если у вас возникли проблемы с его разбором, возможно, вы могли бы преобразовать свои конфигурационные файлы с помощью PyYAML:
with open('converted.yaml', 'w') as f:
f.write(yaml.dump(yaml.load(s)))