【问题标题】:Case-insensitive sections in ConfigParserConfigParser 中不区分大小写的部分
【发布时间】:2018-04-10 13:54:05
【问题描述】:

我在看Python 3.6 documentation 上面写着的地方

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

对于它说的脚注

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

所以我查看了“14.2.7。自定义解析器行为”,但我找不到关于如何使部分不区分大小写的描述。

我想要这样的部分:

[SETTINGS]
...

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

【问题讨论】:

  • [SETTINGS] 不是“部分中的键”,而是一个部分。所以也许报价不适用。
  • @Lutz Horn,抱歉,我的引用有误。我已经更新了问题。
  • 可能是骗子,没仔细看:stackoverflow.com/questions/26179728/… 无论哪种方式,您可能都想覆盖SECTCRE 属性。
  • 从问题的角度来看,这是一个骗局。除非有人有更好的答案,否则我将使用那里提出的答案。虽然很明显 ConfigParser 只希望能够更改匹配,而不是修改它。

标签: python configparser


【解决方案1】:

您可以在 Python 3.x 中相当容易地做到这一点,方法是传递 ConfigParser documentation 中描述的可选 dict_type= 关键字参数——在这种情况下,我们希望类型是不区分大小写的有序 @ 987654326@.

不幸的是,标准库中没有一个,也没有一个我知道的锥形实现......所以我拼凑了一个作为示例。它尚未经过严格测试,但足以说明总体思路。

注意:为了测试,我使用了以下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/

【讨论】:

  • 我已经接受了这个答案,因为它解决了我的问题,尽管我相信它不仅仅影响部分标题; like 选项(尽管默认情况下它们不区分大小写)。
  • senevoldsen:是的,它也使选项名称不区分大小写,但正如您所指出的,无论如何这都是默认行为......不幸的是,这不能通过提供的常用技术覆盖使用建议的dict_type 时的自定义optionxform() 函数。用于每个部分的选项名称的 ping。继续...
  • cont 此外,在查看 configparser source 之后,我认为没有办法让部分名称不区分大小写,但不是选项名称,因为dict_type 用于部分名称的映射以及选项名称到值的映射。
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 2013-03-06
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
相关资源
最近更新 更多