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()
и тогда вам не понадобится странная запятая в конце списка из одного элемента.