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

2024-09-27 04:28:09 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我的配置文件示例

[HEAD1]
key1 = val1
key2 = val2

[HEAD2]
key1 = 
key2 = val2

我想写一个高效的代码,它会向用户抛出一个错误,指出任何选项是否缺少值(如果它是空的,则在“=”之后没有给定值)

我正在使用PythonConfigParser模块

^{pr2}$

我很高兴知道是否有任何有效的方法可以快速识别相同的内容,而不是重复两个循环。在


Tags: 模块代码用户示例配置文件选项错误key2
1条回答
网友
1楼 · 发布于 2024-09-27 04:28:09

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

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

您可以将RawConfigParser子类化并重写_read()方法,以便在将这些空字符串值插入到内部dict中之前捕获这些空字符串值。但是,_read相当冗长,在其中捕获不需要的值显得有点笨拙。只有在Python版本低于2.6的情况下,我才会走这条路。
在这个场景中,您将在处理选项行时添加对空字符串的检查

^{pr2}$

empty values have been handled之后。在


在Python2.6中,^{}(及其后代)接受一个可选参数dict_type,它允许您传入一个自定义字典类,解析器将在内部使用该类。
在Python2.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中,重写RawConfigParser子类中的_read,在Python>;=2.6中使用自定义可变映射类型dict_type,这两个选项的优点是在解析配置时已经执行了检查;无需再次遍历完全解析的配置。在

相关问题 更多 >

    热门问题