Question

J'ai lu la partie de les documents et constaté que le ConfigParser renvoie une liste de paires clé / valeur pour les options d'une section. J'ai pensé que les clés n'avaient pas besoin d'être uniques dans une section, sinon l'analyseur renverrait simplement un mappage. J'ai conçu mon schéma de fichier de configuration autour de cette hypothèse, puis j'ai malheureusement réalisé que ce n'était pas le cas:

>>> from ConfigParser import ConfigParser
>>> from StringIO import StringIO
>>> fh = StringIO("""
... [Some Section]
... spam: eggs
... spam: ham
... """)
>>> parser = ConfigParser()
>>> parser.readfp(fh)
>>> print parser.items('Some Section')
[('spam', 'ham')]

Ensuite, je suis retourné et j'ai trouvé la partie de la documentation que je devrais avoir lue:

  

Les sections sont normalement stockées dans un   dictionnaire intégré. Une alternative   type de dictionnaire peut être passé à la   Constructeur ConfigParser. Par exemple,   si un type de dictionnaire est passé que   trie ses clés, les sections seront   triés sur la reprise, comme ce sera le   touches dans chaque section.

Pour conserver mon schéma de fichier de configuration existant (ce que j'aime vraiment beaucoup maintenant), je songe à transmettre un objet de type mappage, tel que mentionné ci-dessus, qui accumule des valeurs au lieu de les masquer. Existe-t-il un moyen plus simple d’empêcher l’effondrement des clés / valeurs que je manque? Au lieu de créer un adaptateur fou (qui pourrait casser si les modifications apportées à la mise en œuvre de ConfigParser ) devrais-je écrire une variante du ConfigParser lui-même?

Je sens que cela pourrait être un de ces moments difficiles où je ne vois que des solutions difficiles.

[Éditer:] Voici un exemple plus précis de la manière dont j'aimerais utiliser la même clé plusieurs fois:

[Ignored Paths]
ignore-extension: .swp
ignore-filename: tags
ignore-directory: bin

Je n'aime pas la syntaxe de liste délimitée par des virgules car il est difficile pour les yeux de la réduire à beaucoup de valeurs; Par exemple, une liste de cinquante extensions séparées par des virgules ne serait pas particulièrement lisible.

Était-ce utile?

La solution

ConfigParser n’est pas conçu pour gérer de telles conditions. De plus, votre fichier de configuration n’a aucun sens pour moi.

ConfigParser vous donne une structure semblable à celle de la dictée pour chaque section. Ainsi, lorsque vous appelez parser.items (section), j'attends une sortie similaire à dict.items (), qui n'est qu'une liste de tuples clé / valeur. Je ne m'attendrais jamais à voir quelque chose comme:

[('spam', 'eggs'), ('spam', 'ham')]

Sans oublier, comment vous attendez-vous à ce que les éléments suivants se comportent?:

parser.get('Some Section', 'spam')

Quel est le moyen prévu pour récupérer des valeurs.

Si vous souhaitez stocker plusieurs valeurs pour la même clé, je suggérerais quelque chose comme ceci dans votre fichier de configuration:

[Some Section]
spam: eggs, ham

Et ceci dans votre code:

spam_values = [v.strip() for v in parser.get('Some Section', 'spam').split(',')]

Bien sûr, cela ne fonctionnera que pour les valeurs qui ne contiennent pas de virgules ni ne traitent les guillemets. Pour cela, vous devez utiliser une technique plus avancée (voir this et cette ).

EDIT: Si la dépendance supplémentaire ne vous dérange pas, consultez ConfigObj , qui prend en charge de manière native les listes en tant que type de valeur.

scroll top