Une chose que beaucoup de gens ne savent pas, c'est que les valeurs de configuration multi-lignes sont autorisées. Par exemple :
;test.ini
[hello]
barlist =
item1
item2
La valeur de config.get('hello','barlist')
sera maintenant :
"\nitem1\nitem2"
Que vous pouvez facilement diviser avec la méthode splitlines (n'oubliez pas de filtrer les éléments vides).
Si nous regardons un grand framework comme Pyramid, ils utilisent cette technique :
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):
""" Retourne une liste de chaînes, séparant l'entrée en fonction des sauts de ligne et, si flatten=True (par défaut), également en séparant les espaces à l'intérieur de chaque ligne."""
values = aslist_cronly(value)
if not flatten:
return values
result = []
for value in values:
subvalues = value.split()
result.extend(subvalues)
return result
Source
Personnellement, je pourrais peut-être étendre le ConfigParser si c'est quelque chose de courant pour vous :
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)]
Notez qu'il y a quelques choses à prendre en compte lorsque vous utilisez cette technique
- Les nouvelles lignes qui sont des éléments doivent commencer par un espace (par exemple un espace ou une tabulation)
- Toutes les lignes suivantes qui commencent par un espace sont considérées comme faisant partie de l'élément précédent. De plus, si elle contient un signe = ou si elle commence par un ; suivant l'espace.