Многие люди не знают, что допустимы многострочные значения конфигурации. Например:
;test.ini
[hello]
barlist =
item1
item2
Значение config.get('hello','barlist')
теперь будет:
"\nitem1\nitem2"
Который вы легко можете разделить с помощью метода splitlines (не забудьте отфильтровать пустые элементы).
Если мы посмотрим на большую структуру, такую как Пирамида, они используют эту технику:
def aslist_cronly(value):
if isinstance(value, string_types):
value = filter(None, [x.strip() for x in value.splitlines()])
return list(value)
def aslist(value, flatten=True):
""" Return a list of strings, separating the input based on newlines
and, if flatten=True (the default), also split on spaces within
each line."""
values = aslist_cronly(value)
if not flatten:
return values
result = []
for value in values:
subvalues = value.split()
result.extend(subvalues)
return result
Источник
Я бы, возможно, расширил бы ConfigParser, если это обычная вещь для вас:
class MyConfigParser(ConfigParser):
def getlist(self,section,option):
value = self.get(section,option)
return list(filter(None, (x.strip() for x in value.splitlines())))
def getlistint(self,section,option):
return [int(x) for x in self.getlist(section,option)]
Обратите внимание, что есть несколько вещей, на которые следует обратить внимание при использовании этой техники
- Новые строки, которые являются элементами, должны начинаться с пробела (например, пробел или табуляция)
- Все последующие строки, начинающиеся с пробела, считаются частью предыдущего элемента. Также, если он имеет знак = или если он начинается с; после пробела.