我读的一部分 文档 和看到的 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')]

然后我回去找到的部分docs我 应该 有阅读:

部分通常存储在一个 builtin词典。一个替代的 典型可以传递的 ConfigParser构造。例如, 如果一个典型的传递, 各种其键,该部分会 排序在写回,如将 钥匙在每一个部分。

保持现有的配置文件方案(其中我真的很喜欢现在)我想穿的映射对象如上所述,累积价值观,而不会重装他们。是有一个简单的方法来防止key/value崩溃,我的失踪?而不是让一个疯狂的适配(可能打破,如果 ConfigParser's执行情况的变化),我应该只写的一个变种 ConfigParser 本身?

我觉得这可能是那个'哼'的时刻在那里我只看到困难的解决方案。

[编辑:] 这里有一个更精确的例子,我想到使用相同的密钥多次:

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

我不喜欢逗号分隔的列表法,因为它的硬盘上眼睛的时候你的扩展到许多值;例如,一个逗号分隔的列表的五十扩展将不会特别有可读性。

有帮助吗?

解决方案

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 ,本机支持列表作为值类型。

其他提示

这一缺陷的ConfigParser的原因是,为什么pyglet用 修补版本的epydoc 替换ConfigParser ini这个 简单的格式:

name: pyglet
url: http://www.pyglet.org/

output: html
target: doc/api/
...    
module: pyglet

exclude: pyglet.gl.gl
exclude: pyglet.gl.agl
exclude: pyglet.gl.lib_agl
exclude: pyglet.gl.wgl
...

如果你不需要的部分--这种办法可能是有用的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top