Ste*_*nto 12 xml perl ini json yaml
我在几个应用程序中一直使用YAML作为配置文件格式,除了一件事情之外一切顺利:当我的程序需要在YAML配置文件中编写/修改配置变量时,它会通过加载和转储整个文件来破坏格式和注释/结构体.
(嗯,实际上YAML存在另一个问题.大多数用户,其中很多都不是程序员,会被YAML规则的细节所绊倒,比如某些地方的空白的重要性.但这不是一个主要的抱怨.)
我更喜欢的是一个YAML加载器/转储器,它可以进行往返解析(保留所有空格和注释),或者其他具有这种解析器的人类可读序列化格式.我甚至考虑使用Perl文档和PPI,因为PPI是一个往返安全解析器.或者PPI可能会倾向于处理YAML或类似的格式?我宁愿不使用XML,在此之前我会使用INI +(JSON | YAML | ...作为键值).
有什么建议或指示?
如果你使用块结构化的YAML并且Python是可以接受的,你可以使用Python包¹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)
Run Code Online (Sandbox Code Playgroud)
结果:
# example
name:
# details
family: Smith # very common
given: Bob # one of the siblings
Run Code Online (Sandbox Code Playgroud)
请注意,行尾注释仍然是对齐的.
而不是普通的list
和dict
对象code
组成的评论所附的包装版本².
¹ 安装pip install ruamel.yaml
.适用于Python 2.6/2.7/3.3 +.免责声明:我是该套餐的作者.
² 用于映射,以保持排序 ordereddict
小智 3
是的,你和所有认为yaml 听起来很酷的人,简单地说,它还不存在。
更新:您可能想使用 Config::General,它的 apache 配置格式(xmlish)
不,PPI 不是通用工具,如果你想要 BNF,你想使用 Marpa
在所有 INI/JSON/YAML/XML 中,XML 可能为非程序员提供最好的编辑器支持(听起来很疯狂)