首页 > 解决方案 > ConfigParser.setdefault() 的使用

问题描述

我试图在实例化configparser.ConfigParser后的实例上设置默认值。在检查实例时,我发现了方法ConfigParser.setdefault()

Help on method setdefault in module collections.abc:

setdefault(key, default=None) method of configparser.ConfigParser instance
    D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

虽然这根本不是很有帮助,但官方文档甚至没有提到这种公共方法。

所以我开始尝试错误:

>>> cp.setdefault('asd', 'foo')
<Section: asd>
>>> cp['asd']
<Section: asd>
>>> cp['asd']['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/configparser.py", line 1233, in __getitem__
    raise KeyError(key)
KeyError: 'foo'
>>> cp['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/configparser.py", line 959, in __getitem__
    raise KeyError(key)
KeyError: 'foo'
>>> cp.setdefault('asd', {'foo': 'bar'})
<Section: asd>
>>> cp['asd']
<Section: asd>
>>> cp['asd']['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/configparser.py", line 1233, in __getitem__
    raise KeyError(key)
KeyError: 'foo'
>>> cp['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/configparser.py", line 959, in __getitem__
    raise KeyError(key)
KeyError: 'foo'
>>> 

但是我不知道如何使用带有 value'asd'的默认键来初始化默认部分。'foo''bar'

所以我的问题是:

  1. 方法ConfigParser.setdefault()是干什么用的?
  2. 初始化后如何在我ConfigParser的实例上设置默认值?

更新
经过进一步调查,结果证明ConfigParser.setdefault()是继承自_collections_abc.MutableMapping.

标签: pythonpython-3.6configparser

解决方案


ConfigParser.setdefault与设置 ConfigParser 的默认值无关。如果要设置默认值,请使用DEFAULT为其他部分提供默认值的部分:

cp['DEFAULT']['key'] = 'value'

或者,如果您配置了不同的default_section,请使用您配置的任何内容。

文档中所述,

configparser 对象的行为尽可能接近实际字典。映射接口完整,遵循 MutableMapping ABC。但是,有一些差异需要考虑:

[差异列表,其中不涉及setdefault]

setdefault是 MutableMapping 指定的操作之一。cp.setdefault('asd', 'foo')尝试设置cp['asd'] = 'foo',如果没有条目cp['asd'],则返回cp['asd']

在 ConfigParser 中,一个条目cp['asd']将是一个'asd'部分,并且设置 是不合法的cp['asd'] = 'foo'。设置映射是合法cp['asd']的,但是您已经有了一个cp['asd']部分,所以您的cp.setdefault('asd', {'foo': 'bar'})调用也没有做任何事情。


推荐阅读