保留注释的数据结构格式(YAML 或诸如此类)的往返解析,用于编写配置
Posted
技术标签:
【中文标题】保留注释的数据结构格式(YAML 或诸如此类)的往返解析,用于编写配置【英文标题】:Round-trip parsing of data structure format (YAML or whatnot) preserving comments, for writing configuration 【发布时间】:2011-10-19 22:12:40 【问题描述】:我一直在几个应用程序中使用 YAML 作为配置文件格式,并且一切顺利,除了一件事:当我的程序需要在 YAML 配置文件中写入/修改配置变量时,它会通过加载和转储来破坏格式和 cmets整个文件/结构。
(嗯,实际上 YAML 还有一个问题。大多数用户,其中许多不是程序员,都会被 YAML 规则的细节绊倒,比如某些地方空格的重要性。但这不是主要的抱怨.)
我更喜欢的是 YAML 加载器/转储器,它可以进行往返解析(保留所有空格和 cmets),或者具有此类解析器的其他一些人类可读的序列化格式。我什至考虑使用 Perl 文档和 PPI,因为 PPI 是一个往返安全的解析器。或者也许 PPI 可以处理 YAML 或类似格式?我宁愿不使用 XML,在此之前我会求助于 INI+(JSON|YAML|... for key values)。
有什么建议或指示吗?
【问题讨论】:
【参考方案1】:是的,你和所有认为 哇,yaml 听起来很酷,简单地说,它不存在的人,然而
更新:您可能想要使用 Config::General,它的 apache 配置格式 (xmlish)
不,PPI 不是通用工具,如果你想要 BNF-ness,你想使用 Marpa
在所有 INI/JSON/YAML/XML 中,XML 可能为非程序员提供最好的编辑器支持(听起来很疯狂)
【讨论】:
“它没有退出”——这是否意味着“它不存在”?【参考方案2】:一种方法是使用“镜头”。请参阅Augeas 了解一种实现方式。
【讨论】:
请注意:Augeas 尚不支持 YAML。 @Raphlink:它告诉我们一些关于 YAML 或 Augeas 的信息。我个人认为它比 Augeas 更能说明 YAML ;-) 我非常喜欢 YAML 用于复杂的配置文件或作为共享序列化数据的进程间手段,但它是一种复杂的格式。 JSON 镜头已经很复杂,但 YAML 增加了更复杂的东西:几种编写数组、引用及其关联指针的方法等。【参考方案3】:如果您使用的是块结构的 YAML 并且 Python 是可以接受的,那么您 可以使用 Python 包¹ruamel.yaml,它是 PyYAML 和支持 cmets 的往返保存:
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
请注意,行尾 cmets 仍然对齐。
code
由 code
组成,而不是普通的 list
和 dict
对象
附有 cmets 的包装版本²。
¹ 使用pip install ruamel.yaml
安装。适用于 Python 2.6/2.7/3.3+。
免责声明:我是该软件包的作者。
² ordereddict
用于映射,以保持顺序
【讨论】:
以上是关于保留注释的数据结构格式(YAML 或诸如此类)的往返解析,用于编写配置的主要内容,如果未能解决你的问题,请参考以下文章