当前位置:  开发笔记 > 编程语言 > 正文

Python的ConfigParser每个部分的唯一键

如何解决《Python的ConfigParser每个部分的唯一键》经验,为你挑选了1个好方法。

我阅读了部分文档,并看到ConfigParser返回一个部分中选项的键/值对列表.我认为在一个部分中键不需要是唯一的,否则解析器只会返回一个映射.我围绕这个假设设计了我的配置文件模式,然后遗憾地意识到情况并非如此:

>>> from ConfigParser import ConfigParser
>>> from StringIO import StringIO
>>> fh = StringIO("""
... [Some Section]
... spam: eggs
... spam: ham
... """)
>>> parser = ConfigParser()
>>> parser.readfp(fh)
>>> print parser.items('Some Section')
[('spam', 'ham')]

然后我回去找到了我应该阅读的文档部分:

节通常存储在内置字典中.可以将另一个字典类型传递给ConfigParser构造函数.例如,如果传递了对其键进行排序的字典类型,则将在回写时对这些部分进行排序,每个部分中的键也将进行排序.

保留我现有的配置文件方案(我现在非常喜欢;)我正在考虑传递一个类似于映射的对象,如上所述,它会累积值而不是破坏它们.是否有一种更简单的方法来防止我丢失的键/值崩溃?ConfigParser我应该编写一个ConfigParser自己的变体,而不是制作一个疯狂的适配器(如果实现更改可能会破坏)?

我觉得这可能是那些我只看到困难解决方案的"呃"时刻之一.

[编辑:]这是一个更精确的例子,说明我多次使用相同的密钥:

[Ignored Paths]
ignore-extension: .swp
ignore-filename: tags
ignore-directory: bin

我不喜欢逗号分隔列表语法,因为当你将它缩放到很多值时,它很难看.例如,以逗号分隔的50个扩展名列表将不具有特别的可读性.



1> Jeremy Cantr..:

ConfigParser不是为处理这种情况而设计的.此外,您的配置文件对我没有意义.

ConfigParser为每个部分提供了一个类似dict的结构,所以当你调用parser.items(section)时,我期待类似的输出到dict.items(),它只是一个键/值元组的列表.我永远不会期待看到类似的东西:

[('spam', 'eggs'), ('spam', 'ham')]

更不用说,你会如何期待以下行为?:

parser.get('Some Section', 'spam')

这是检索值的预期方法.

如果你想为同一个密钥存储多个值,我会在你的配置文件中建议这样的东西:

[Some Section]
spam: eggs, ham

这在您的代码中:

spam_values = [v.strip() for v in parser.get('Some Section', 'spam').split(',')]

当然,这仅适用于不包含逗号本身或处理引用的值.为此,您应该采用更先进的技术(参见本节和此).

编辑:如果你不介意额外的依赖,你可以看看ConfigObj,它本身支持列表作为值类型.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有