2014-08-29 4 views
1

Я смотрел на 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,) 

У меня есть несколько из этих разделов, и у меня есть их в цикле. Я применяю их к классам, которые принимают только списки, и я не хочу, чтобы каждый отдельный код ко всем специальным случаям добавлял список вокруг них (не говоря уже о том, что он не прошел проверку).

Для полноты, вот как я проверить вещи:

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) 

ответ

3

Я один из нынешних разработчиков configobj. Согласно этому модулю test line, я ожидал бы, что sensors = $virtual, будет работать так, как вы ожидали.

Я не уверен, как я отношусь к ($virtual,), возвращая список из двух элементов. Это кажется неправильным. Вероятно, стоит открыть проблему, если вы не можете представить сценарий, в котором вы действительно ожидаете, что хотите получить неявную пустую строку.

0

Согласно the docs, если это так, вы хотите, чтобы для вашего configspec вы могли просто использовать sensors = force_list(), а затем вам не понадобилась бы странная запятая в конце списка отдельных элементов.