Python 如何使ConfigParser返回默认值而不是引发NoOptionError?
我有一个定义了一些选项的配置文件。有时,如果没有找到请求的选项,我希望忽略错误并返回Python 如何使ConfigParser返回默认值而不是引发NoOptionError?,python,python-2.7,exception-handling,configparser,Python,Python 2.7,Exception Handling,Configparser,我有一个定义了一些选项的配置文件。有时,如果没有找到请求的选项,我希望忽略错误并返回None setting.cfg: [Set] ip=some_ip verify=yes #if verify does not exist here --> verify=None test.py: import sys import ConfigParser file="setting.cfg" class ReadFile: def read_cfg_file(self):
None
setting.cfg
:
[Set]
ip=some_ip
verify=yes #if verify does not exist here --> verify=None
test.py
:
import sys
import ConfigParser
file="setting.cfg"
class ReadFile:
def read_cfg_file(self):
configParser = ConfigParser.RawConfigParser(allow_no_value=True)
if os.path.isfile(file):
configParser.read(file)
else:
sys.exit(1)
try:
verify = configParser.get('Set', 'verify')
except ConfigParser.NoOptionError:
pass
return verify,and,lots,of,other,values
如果我这样处理它,就不能返回值,因为如果找不到'verify'
选项,它只会传递
如果找不到选项,是否有任何方法可以忽略错误,而返回None
例如,类似这样的内容:
verify = configParser.get('Set', 'verify')
if not verify:
verify=False
如果是我,我会从
RawConfigParser
派生一个新的配置解析器类,只添加新的特殊行为,如下所示:
from ConfigParser import RawConfigParser, NoOptionError
from StringIO import StringIO
from collections import defaultdict
class MyConfigParser(RawConfigParser):
def get(self, section, option):
try:
return RawConfigParser.get(self, section, option)
except NoOptionError:
return None
settings=StringIO('''
[Set]
ip=192.0.2.76
verify=yes
[Set2]
ip=192.0.2.74
''')
cfg=MyConfigParser(allow_no_value=True)
cfg.readfp(settings)
assert cfg.get('Set', 'verify') == 'yes'
assert cfg.get('Set2', 'verify') == None
Python3的
configparser
模块是并提供了get(选项,默认值)
方法
Python2的ConfigParser
s允许使用DEFAULT
部分(),尽管在这种情况下,您必须提前知道每个选项的默认值
如果您使用的是Python 2,并且需要在调用站点提供默认值,那么按照Rob的回答进行子分类似乎是一种可行的方法。Python 2.7.12 您可以利用
ConfigParser()
类
方法,该方法允许您在调用时指定默认字典:
$ cat myconf.txt
[files]
path1 = /tmp
path2 = /usr/bin
path3 =
$ ipython
...
In [1]: import ConfigParser
...:
...: cp = ConfigParser.ConfigParser(allow_no_value=True)
...: cp.read('myconf.txt')
...: defaults = { 'path4' : '/opt/include'}
...: print 'path1:', cp.get('files', 'path1', 0, defaults)
...: print 'path3:', cp.get('files', 'path3', 0, defaults)
...: print 'path4:', cp.get('files', 'path4', 0, defaults)
...:
path1: /tmp
path3:
path4: /opt/include