ConfigParser中不区分大小写的部分

时间:2018-04-10 13:54:05

标签: python configparser

我正在查看Python 3.6 documentation所说的

  

默认情况下,节名称区分大小写,但键不是[1]。

对于脚注,它说

  

[1](1,2,3,4,5,6,7,8,9,10)配置解析器允许大量定制。如果您有兴趣更改脚注引用所概述的行为,请参阅自定义分析器行为部分。

所以我看看" 14.2.7。自定义分析器行为"但我找不到如何使区段不区分大小写的描述。

我想要一个这样的部分:

[SETTINGS]
...

可以像config['section']这样访问,但目前我收到了错误消息。这是我想要应用的配置解析器的唯一更改。

1 个答案:

答案 0 :(得分:2)

你可以在Python 3.x中通过传递ConfigParser documentation中描述的可选dict_type=关键字参数来相当容易地做到这一点 - 在这种情况下我们希望类型是一个案例 - 不敏感的有序dictionary

不幸的是,标准库中没有一个,也没有我所知道的锥形实现...所以我拼凑了一个用作例子。它没有经过严格的测试,但运作良好,足以说明一般的想法。

注意:为了进行测试,我使用了以下simple.ini文件(我从pymotw刷过):

# This is a simple example with comments.
[bug_tracker]
url = http://localhost:8080/bugs/
username = dhellmann
; You should not store passwords in plain text
; configuration files.
password = SECRET

这是一个演示,显示使用一个来做所需的事情:

import collections
from configparser import ConfigParser

class CaseInsensitiveDict(collections.MutableMapping):
    """ Ordered case insensitive mutable mapping class. """
    def __init__(self, *args, **kwargs):
        self._d = collections.OrderedDict(*args, **kwargs)
        self._convert_keys()
    def _convert_keys(self):
        for k in list(self._d.keys()):
            v = self._d.pop(k)
            self._d.__setitem__(k, v)
    def __len__(self):
        return len(self._d)
    def __iter__(self):
        return iter(self._d)
    def __setitem__(self, k, v):
        self._d[k.lower()] = v
    def __getitem__(self, k):
        return self._d[k.lower()]
    def __delitem__(self, k):
        del self._d[k.lower()]


parser = ConfigParser(dict_type=CaseInsensitiveDict)
parser.read('simple.ini')

print(parser.get('bug_tracker', 'url'))  # -> http://localhost:8080/bugs/
print(parser.get('Bug_tracker', 'url'))  # -> http://localhost:8080/bugs/