我一直在查看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)发布于 2014-08-29 13:33:30
我是目前的开发人员之一。根据这个单元测试线路,我希望sensors = $virtual,按照您预期的方式工作。
我不知道($virtual,)返回两个元素列表的感觉如何。这似乎不对。可能值得打开一个问题,除非您能够想象一个实际需要隐式空字符串的场景。
发布于 2015-05-14 17:32:14
根据医生们的说法,如果它是您想要的字符串,对于configspec,您只需使用sensors = force_list(),那么就不需要在单个元素列表的末尾使用奇怪的逗号了。
https://stackoverflow.com/questions/25561597
复制相似问题