如何使 ConfigParser 返回默认值而不是引发 NoOptionError?

Dav*_*ave 5 python exception configparser python-2.7

我有一个配置文件,其中定义了一些选项。有时,如果找不到请求的选项,我想忽略错误并返回None

setting.cfg

[Set]
ip=some_ip
verify=yes     #if verify does not exist here --> verify=None
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果我这样处理它,我将无法返回值,因为如果'verify'找不到该选项,它就会简单地传递。

如果找不到选项,有什么方法可以忽略错误,而是返回None

例如,这样的事情:

verify = configParser.get('Set', 'verify')
if not verify:
    verify=False
Run Code Online (Sandbox Code Playgroud)

Sam*_*man 5

Python 3的configparser模块得到了很大的改进并提供了一种get(option, default)方法。

Python 2ConfigParser允许有一个DEFAULT部分(在构建时提供),尽管在这种情况下您必须提前知道每个选项的默认值。

如果您使用 Python 2 并且需要在调用站点提供默认值,那么根据 Rob 的答案进行子类化似乎是可行的方法。

  • Py3 方法对我来说效果很好。请注意,要获得一个行为类似于“dict”的“get”方法,您需要一个“configparser”**部分**而不是解析器本身。例如。`解析器= ConfigParser(); parser.read('settings.ini'); 节=解析器['节']; section.get('选项', '默认')`。如果直接使用解析器,则需要更明确:`parser.get('SECTION', 'option',fallback='default')`。有关详细信息,请参阅 https://docs.python.org/3/library/configparser.html#fallback-values。 (2认同)

Rob*_*obᵩ 3

如果是我,我会从 派生一个新的配置解析器类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
Run Code Online (Sandbox Code Playgroud)