用于编写配置的数据结构格式(YAML或诸如此类)保留注释的往返解析

时间:2011-08-04 11:38:24

标签: xml perl json yaml ini

我一直在几个应用程序中使用YAML作为配置文件格式,除了一件事情之外一切顺利:当我的程序需要在YAML配置文件中编写/修改配置变量时,它会通过加载和转储来破坏格式和注释整个文件/结构。

(嗯,实际上YAML存在另一个问题。大多数用户,其中很多都不是程序员,会被YAML规则的细节所绊倒,比如某些地方的空白的重要性。但这不是一个主要的抱怨。)

我更喜欢的是一个YAML加载器/转储器,它可以进行往返解析(保留所有空格和注释),或者其他具有这种解析器的人类可读序列化格式。我甚至考虑使用Perl文档和PPI,因为PPI是一个往返安全解析器。或者PPI可能会倾向于处理YAML或类似的格式?我宁愿不使用XML,在此之前我会使用INI +(JSON | YAML | ...作为键值)。

有任何建议或指示吗?

3 个答案:

答案 0 :(得分:8)

如果你使用块结构化的YAML并且Python是可以接受的,那么你 可以使用Python包{1}},它是衍生的。ruamel.yaml PyYAML和支持往返保留评论

import sys
import ruamel.yaml

inp = """\
# example
name:
  # details
  family: Smith   # very common
  given: Alice    # one of the siblings
"""

yaml = ruamel.yaml.YAML()

code = yaml.load(inp)
code['name']['given'] = 'Bob'

yaml.dump(code, sys.stdout)

结果:

# example
name:
  # details
  family: Smith   # very common
  given: Bob      # one of the siblings

请注意,行尾注释仍然是对齐的。

listdict组成而不是普通codepip install ruamel.yaml个对象 包装版本²附上评论。

¹使用ordereddict安装。适用于Python 2.6 / 2.7 / 3.3 +。 免责声明:我是该套餐的作者。
² {{1}}用于映射,以保持排序

答案 1 :(得分:3)

是的,你和那些认为哇,yaml听起来很酷的人,简单地说,它不存在

更新:你可能想使用Config :: General,它的apache配置格式(xmlish)

不,PPI不是通用工具,如果你想要BNF-ness,你想使用Marpa

在所有INI / JSON / YAML / XML中,XML可能对非程序员有最好的编辑支持(听起来很疯狂)

答案 2 :(得分:2)

一种方法是使用“镜头”。有关一种实现,请参阅Augeas