ConfigObj/ConfigParser 与使用 YAML 作为 Python 设置文件
对于为Python程序创建设置文件,内置模块(ConfigParser)或独立项目(ConfigObj),还是使用YAML数据序列化格式,哪个更好?我听说 ConfigObj 比 ConfigParser 更容易使用,尽管它不是内置库。我还了解到 PyYAML 很容易使用,尽管 YAML 需要一些时间来使用。除了易于实施之外,哪个是创建设置/配置文件的最佳选择?
Which is better for creating a settings file for Python programs, the built-in module (ConfigParser) or the independent project (ConfigObj), or using the YAML data serialization format? I have heard that ConfigObj is easier to use than ConfigParser, even though it is not a built-in library. I have also read that PyYAML is easy to use, though YAML takes a bit of time to use. Ease of implementation aside, which is the best option for creating a settings/configuration file?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这取决于您想要在配置文件中存储的内容以及如何使用它们
如果您进行往返 (yaml→code→yaml) 并希望保留注释,则不能使用
PyYAML
或配置解析器
。如果您想保留键的顺序(例如,当您签入配置文件时),
PyYAML
不会执行此操作,除非您指定!!omap
(这使得它比普通映射更不容易更新)如果您想要具有包含映射/字典的未命名元素列表的复杂结构,那么
ConfigParser
和ConfigObj
将不会'这对您没有帮助,因为 INI 文件键值对必须进入各个部分,并且列表只能是值。YAML 阅读器的
ruamel.yaml
实现支持所有上述 1。我长期以来一直使用 fuzzyman 出色的 ConfigObj 来保存往返注释,并使用 PyYAML 来保存更复杂的结构,这结合了两全其美。ruamel.yaml
包含yaml
实用程序,可以将ConfigObj
INI 文件转换为 YAML1 ruamel.yaml 是一个支持 YAML 的 YAML 库1.2(我建议使用它,但我是该包的作者)。 PyYAML 仅支持(大部分)YAML 1.1。
It depends on what you want to store in your config files and how you use them
If you do round tripping (yaml→code→yaml) and want comments preserved you cannot use
PyYAML
orConfigParser
.If you want to preserve the order of your keys (e.g. when you check in your config files),
PyYAML
doesn't do that unless you specify!!omap
(which makes it less easy to update than a normal mapping)If you want to have complex structures with lists of unnamed elements containing mappings/dictionaries, then
ConfigParser
andConfigObj
won't help you as the INI files key-value pairs have to go into sections and lists can only be values.The
ruamel.yaml
implementation of the YAML reader supports all of the above ¹. I have used fuzzyman's excellent ConfigObj for round trip comment preservation for a long time, as well as PyYAML for more complex structures and this combines best of both worlds.ruamel.yaml
includes theyaml
utility that can convertConfigObj
INI files to YAML¹ ruamel.yaml is a YAML library that supports YAML 1.2 (I recommend using that, but then I am the author of the package). PyYAML only supports (most of) YAML 1.1.
使用 ConfigObj 至少非常简单,并且一般中的 ini 文件比 YAML 简单得多(并且使用更广泛)。对于更复杂的情况,包括验证、默认值和类型,ConfigObj 提供了一种通过 configspec 验证来实现此目的的方法。
使用 ConfigObj 读取 ini 文件的简单代码:
它自动为您处理列表值并允许多行值。如果您修改配置文件,您可以将其写回,同时保留顺序和注释。
有关详细信息,请参阅这些文章,包括类型验证的示例:
Using ConfigObj is at least very straightforward and ini files in general are much simpler (and more widely used) than YAML. For more complex cases, including validation, default values and types, ConfigObj provides a way to do this through configspec validation.
Simple code to read an ini file with ConfigObj:
It automatically handles list values for you and allows multiline values. If you modify the config file you can write it back out whilst preserving order and comments.
See these articles for more info, including examples of the type validation:
ConfigParser 有一个非常糟糕的 API,ConfigObj 应该很好,但我从未使用过它,对于 ini 文件我通常实现自己的解析器。
然而,类似 ini 的格式无论如何都不能很好地处理不同的类型、序列或递归映射,所以我只使用 yaml。使用编辑器很容易阅读和编辑,有一个解析这些文件的标准,并且您没有提到的类似 ini 格式的缺点。
ConfigParser has a really bad API, ConfigObj is supposed to be good but I have never used it, for ini files I usually implement my own parser.
However ini-like formats don't handle different types, sequences or recursive mappings well anyway so I would just use yaml. It's easy to read and edit with an editor, there is a standard for parsing those files and you have none of the mentioned downsides ini-like formats have.