2

我一直在查看 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)
4

2 回答 2

4

我是当前的 configobj 开发人员之一。根据this unit test line,我希望sensors = $virtual,以您期望的方式工作。

我不确定我对($virtual,)返回一个包含两个元素的列表有何感受。这似乎是错误的。可能值得打开一个问题,除非您可以想象一个您实际预期需要隐式空字符串的场景。

于 2014-08-29T13:33:30.523 回答
1

根据文档,如果它是你想要的字符串,你可以使用你的配置规范sensors = force_list(),然后你就不需要在单个元素列表末尾的奇怪逗号。

于 2015-05-14T17:32:14.720 回答