代码之家  ›  专栏  ›  技术社区  ›  Richard Neumann

使用ConfigParser.setdefault()

  •  0
  • Richard Neumann  · 技术社区  · 8 年前

    我正在尝试设置的实例的默认值 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 不提这个 公众的 方法。

    所以我开始尝试错误:

    >>> 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. 方法是什么 配置分析器.setdefault() 为了什么?
    2. 如何设置默认值 ConfigParser 初始化后的实例?

    更新
    经过进一步调查发现 配置分析器.setdefault() 继承自 _collections_abc.MutableMapping .

    1 回复  |  直到 8 年前
        1
  •  1
  •   user2357112    8 年前

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

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

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

    如中所述 docs ,

    configparser对象的行为尽可能接近实际字典。映射接口是完整的,并遵循可变映射ABC。但是,应该考虑到一些差异:

    [差异列表,没有涉及 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'}) 电话也没做任何事。