ConfigParser.setdefault()的用法

时间:2018-07-31 15:50:31

标签: python python-3.6 configparser

我试图在实例化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

尽管这根本不是很有帮助,但是official documentation甚至没有提到此 public 方法。

所以我开始尝试一下:

>>> 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'
>>> 

但是我不知道如何使用值为'asd'的默认键'foo'初始化默认节'bar'

所以我的问题是:

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

更新
经过进一步调查,结果发现ConfigParser.setdefault()是从_collections_abc.MutableMapping继承的。

1 个答案:

答案 0 :(得分:1)

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

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

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

docs中所述,

  

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'})调用也没有执行任何操作。