下面是我的示例配置文件
[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个循环进行迭代。
答案 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
,具有以下优点:在解析配置时已经执行;无需再次遍历完全解析的配置。