ConfigObj和单个元素列表

时间:2014-08-29 04:12:00

标签: python validation configobj

我一直在看ConfigObj,我遇到了验证和单个元素列表的问题。假设我有一个如下所示的配置规范:

config_specification = """[Data]
  [[__many__]]
    type = option('sense.xml')
    transport = string
    sensors = list
      [[[Identifier]]]
        type = option("name", "mac", "uuid")
        adapter = string(default='')
        name = string(default='')
        file = string(default='')"""

现在该列表实际上可以只是一个元素,也可以是多个元素。我可以轻松做多个:

[Data]
  [[primary]]
    type = sense.xml
    transport = $http
    sensors = $virtual, $gpio, $adc
      [[[Identifier]]]
        type = name
        name = VirtualRelay01

但以下内容无效。它不会将其转换为1:

的列表
sensors = $virtual

我尝试了几种变体。这个没有用

sensors = {$virtual}

这也不是:

sensors = [$virtual]

如果我这样做,它会给我一个包含两个元素的列表!一个空字符串:

sensors = ($virtual,)

我有几个这样的部分,我已经将它们放入for循环中。我将它们应用于只接受列表的类,我不想单独编写所有特殊情况的代码来添加列表(更不用说,验证失败)。

为了完整起见,这是我验证事物的方式:

cfg = ConfigObj(filename, configspec=config_specification.split('\n'))

test = cfg.validate(Validator())

valid = True
for (section_list, key, _) in flatten_errors(cfg, test):
  if key is not None:
    print('Invalid value for key {0} in section {1}'.format(key,', '.join(section_list)))
    valid = False
  else:
    print('Section {0} failed validation'.format(', '.join(section_list)))
    valid = False
if not valid:
  exit(3)

2 个答案:

答案 0 :(得分:3)

我是当前的configobj开发人员之一。根据此单元测试line,我希望sensors = $virtual,以您期望的方式工作。

我不确定我对($virtual,)返回两个元素列表的看法。这似乎是错的。可能值得打开一个问题,除非你能想象一个你实际上预计会想要隐含空字符串的场景。

答案 1 :(得分:0)

根据the docs,如果它是你想要的字符串,对于你的configspec你可以只使用sensors = force_list()然后你就不需要在单个元素列表的末尾有一个奇怪的逗号。