为什么我的yaml没有被正确解析?

时间:2011-05-06 04:37:10

标签: 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: &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 +

rvm

下的红宝石1.9.2-p180

如果还有其他任何事情你需要弄明白,请告诉我。

更新

当我删除此文件的简写语法时,我会转到下一个错误:

psych.rb:148:in `parse': couldn't parse YAML at line 7 column 19 (Psych::SyntaxError)

https://gist.github.com/958472

2 个答案:

答案 0 :(得分:1)

解决方案是将以下内容添加到我的boot.rb

require 'yaml'
YAML::ENGINE.yamler= 'syck'

答案 1 :(得分:0)

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