Python ConfigParser检查选项是否为空的有效方法

时间:2019-02-27 08:34:05

标签: python configparser

下面是我的示例配置文件

[HEAD1]
key1 = val1
key2 = val2

[HEAD2]
key1 = 
key2 = val2

我想编写一个有效的代码,向用户抛出错误,指示是否有任何选项缺少值(如果为空,则在'='之后不提供值)

我正在使用Python ConfigParser 模块

import ConfigParser
config = ConfigParser.RawConfigParser()
config.read("./mytest.cfg")
for section in config.sections():
    for option in config.options(section):
        if not config.get(section, option):
           print "Option: %s has no value under section %s" %(option,section)

我将很高兴知道是否有任何有效的方法可以快速识别出相同的对象,而不是通过2个循环进行迭代。

1 个答案:

答案 0 :(得分:0)

从解析器的角度来看,key1部分中的选项HEAD2 确实有一个值;一个空的字符串实例,它构成解析器的有效值:

print repr(config.get('HEAD2', 'key1'))
# Output: ''

您可以继承RawConfigParser的子类并覆盖_read()方法,以在将这些空字符串值插入内部字典之前捕获它们。但是,_read相当长,在那里捕获不必要的值显得有些笨拙。如果我的Python版本低于2.6,我只会走这条路。
在这种情况下,您将在处理选项行时添加对空字符串的检查

if optval == '':
    print "Option: %s has no value under section %s" % (optname, cursect['__name__'])

empty values have been handled之后。


从Python 2.6开始,RawConfigParser(及其后代)采用可选参数dict_type,该参数允许您传入自定义词典类,解析器将在内部使用该类。
从Python 2.7开始,默认值为collections.OrderedDict,后退为内置dict
您可以创建一个自定义dict类,该类警告有关空字符串实例作为值的情况:

# as done in ConfigParser
try:
    from collections import OrderedDict as _default_dict
except ImportError:
    # fallback for setup.py which hasn't yet built _collections
    _default_dict = dict


class NotifyEmptyStringValueDict(_default_dict):

    def __setitem__(self, key, value):
        if value == "":
            # Consider raising an exception here instead, e.g. ValueError,
            # unless you don't want empty string values to break the parsing
            # and just want a warning message to be displayed while parsing continues
            print "Option: %s has no value under section %s" % (key, self['__name__'])
            # accessing self['__name__'] obviously raises a KeyError when used
            # outside the context of a parser instance. In a parser, this holds
            # the section name
        _default_dict.__setitem__(self, key, value)

然后使用此类dict_type实例化解析器:

config = ConfigParser.RawConfigParser(dict_type=NotifyEmptyStringValueDict)
config.read("./mytest.cfg")

这两个选项在Python <2.6中的_read的子类中覆盖RawConfigParser,并且在Python> = 2.6中使用自定义可变映射类型作为dict_type,具有以下优点:在解析配置时已经执行;无需再次遍历完全解析的配置。