蟒蛇的ConfigParser唯一的钥匙每部分
-
08-07-2019 - |
题
我读的一部分 文档 和看到的 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
...
如果你不需要的部分--这种办法可能是有用的。