ConfigObj选项验证

时间:2013-01-15 20:02:40

标签: python exception configobj

我正在使用ConfigObj和Validator来解析python中的配置文件。虽然我很喜欢这个工具,但我在使用configSpec文件进行验证时遇到了问题。我正在使用option()configSpec类型,它强制从受控词汇表中选择值:

output_mode = option("Verbose", "Terse", "Silent")

我希望我的代码知道用户何时输入不在CV中的选项。根据我的喜好,Validator似乎只是说哪个配置密钥验证失败,而不是失败的原因:

from configobj import ConfigObj, flatten_errors
from validate import Validator

config = ConfigObj('config.ini', configspec='configspec.ini')
validator = Validator()
results = config.validate(validator)

if results != True:
    for (section_list, key, _) in flatten_errors(config, results):
        if key is not None:
            print 'The "%s" key in the section "%s" failed validation' % (key, ', '.join(section_list))
        else:
            print 'The following section was missing:%s ' % ', '.join(section_list)

该代码段有效,但有许多原因可能导致密钥验证失败,从不在整数范围内而不在CV中。我不想要询问密钥名称并根据该密钥的故障情况引发不同类型的异常。是否有更简洁的方法来处理特定类型的验证错误?

长时间stackoverflow阅读器,第一次海报: - )

1 个答案:

答案 0 :(得分:1)

更新:我认为这就是我想要做的。关键是config obj将错误存储为异常,然后可以对那些子类ValidateError进行检查。然后,您只需对每个子类进行一次检查,而不是每个参数值进行一次检查。如果验证失败但验证只是抛出异常可能会更好,但可能会丢失其他功能。

self.config = configobj.ConfigObj(configFile, configspec=self.getConfigSpecFile())
validator = Validator()
results = self.config.validate(validator, preserve_errors=True)

for entry in flatten_errors(self.config, results):

   [sectionList, key, error] = entry
   if error == False:
      msg = "The parameter %s was not in the config file\n" % key
      msg += "Please check to make sure this parameter is present and there are no mis-spellings."
      raise ConfigException(msg)

   if key is not None:
      if isinstance(error, VdtValueError):
         optionString = self.config.configspec[key]
         msg = "The parameter %s was set to %s which is not one of the allowed values\n" % (key, self.config[key])
         msg += "Please set the value to be in %s" % optionString
         raise ConfigException(msg)

OptionString只是表单选项(“选项1”,“选项2”)的字符串而不是列表,所以为了让它看起来不错,你需要在()中获取子字符串。