我一直在几个应用程序中使用YAML作为配置文件格式,除了一件事情之外一切顺利:当我的程序需要在YAML配置文件中编写/修改配置变量时,它会通过加载和转储来破坏格式和注释整个文件/结构。
(嗯,实际上YAML存在另一个问题。大多数用户,其中很多都不是程序员,会被YAML规则的细节所绊倒,比如某些地方的空白的重要性。但这不是一个主要的抱怨。)
我更喜欢的是一个YAML加载器/转储器,它可以进行往返解析(保留所有空格和注释),或者其他具有这种解析器的人类可读序列化格式。我甚至考虑使用Perl文档和PPI,因为PPI是一个往返安全解析器。或者PPI可能会倾向于处理YAML或类似的格式?我宁愿不使用XML,在此之前我会使用INI +(JSON | YAML | ...作为键值)。
有任何建议或指示吗?
答案 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
请注意,行尾注释仍然是对齐的。
list
由dict
组成而不是普通code
和pip 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。