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 ответа

Решение

Я один из текущих разработчиков configobj. В соответствии с этой тестовой линией я бы ожидал sensors = $virtual, работать так, как вы ожидаете.

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

Согласно документации, если вам нужна строка, для вашей конфигурации вы можете просто использоватьsensors = force_list() и тогда вам не понадобится странная запятая в конце списка из одного элемента.

Другие вопросы по тегам