python - 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'
所以我的问题是:
方法ConfigParser.setdefault()
是干什么用的?- 初始化后如何在我
ConfigParser
的实例上设置默认值?
更新
经过进一步调查,结果证明ConfigParser.setdefault()
是继承自_collections_abc.MutableMapping
.
解决方案
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'})
调用也没有做任何事情。
推荐阅读
- python - 过滤numpy字符数组
- azure - Azure ARM 无法解析 | 字符
- java - 如何从用户那里获得 @requestBody bean 类字段的别名
- r - 如果其他列匹配 100%,则查找一列中值的最接近匹配
- c# - .Net Core,Eventhub:身份验证失败,因为远程方已关闭传输流
- macos - 如果 listStyle 为 SidebarListStyle(),onMove 将停止工作
- sql - 在 MySQL 或 Hive SQL 中遇到 Lag() 问题
- python - 如何从python中的字符串中删除某些子字符串?
- swift - 无法在 iphone 模拟器上运行简单的 Swift 应用程序:FBSOpenApplicationServiceErrorDomain
- java - 如何在规范方法中使用多个参数过滤对象?