Почему мой yaml не анализируется правильно?

#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)
  

https://gist.github.com/958472

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

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)))