Domanda

Ho letto la parte di i documenti e ho visto che ConfigParser restituisce un elenco di coppie chiave / valore per le opzioni all'interno di una sezione. Ho pensato che le chiavi non dovevano essere univoche all'interno di una sezione, altrimenti il ??parser avrebbe semplicemente restituito una mappatura. Ho progettato il mio schema di file di configurazione attorno a questo presupposto, ma ho purtroppo capito che non è così:

>>> 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')]

Quindi sono tornato indietro e ho trovato la parte dei documenti che avrei dovuto leggere:

  

Le sezioni sono normalmente memorizzate in a   dizionario incorporato. Un'alternativa   il tipo di dizionario può essere passato al   Costruttore ConfigParser. Per esempio,   se viene passato un tipo di dizionario   ordina le sue chiavi, le sezioni saranno   ordinati per riscrittura, come sarà il   chiavi all'interno di ciascuna sezione.

Per mantenere il mio schema di file di configurazione esistente (che ora mi piace molto;) Sto pensando di passare un oggetto simile a una mappatura come menzionato sopra che accumula valori invece di renderli inutilizzabili. Esiste un modo più semplice per impedire il collasso chiave / valore che mi manca? Invece di creare un adattatore pazzo (che potrebbe rompersi se le modifiche all'implementazione di ConfigParser ) dovrei semplicemente scrivere una variante del ConfigParser stesso?

Sento che questo potrebbe essere uno di quei momenti "duh" in cui vedo solo le soluzioni difficili.

[Modifica:] Ecco un esempio più preciso di come vorrei usare la stessa chiave più volte:

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

Non mi piace la sintassi dell'elenco delimitato da virgole perché è difficile da vedere quando si ridimensiona su molti valori; ad esempio, un elenco delimitato da virgole di cinquanta estensioni non sarebbe particolarmente leggibile.

È stato utile?

Soluzione

ConfigParser non è progettato per gestire tali condizioni. Inoltre, il tuo file di configurazione non ha senso per me.

ConfigParser ti offre una struttura simile a dict per ogni sezione, quindi quando chiami parser.items (sezione), mi aspetto un output simile a dict.items (), che è solo un elenco di tuple chiave / valore. Non mi aspetterei mai di vedere qualcosa del genere:

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

Per non parlare di come ti aspetteresti che si comporti quanto segue ?:

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

Qual è il modo previsto per recuperare i valori.

Se vuoi memorizzare più valori per la stessa chiave, suggerirei qualcosa del genere nel tuo file di configurazione:

[Some Section]
spam: eggs, ham

E questo nel tuo codice:

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

Naturalmente, questo funzionerà solo per valori che non contengono virgole o gestiscono le virgolette. Per questo, dovresti utilizzare una tecnica più avanzata (vedi this e this ).

EDIT: se non ti dispiace della dipendenza aggiuntiva, puoi dare un'occhiata a ConfigObj , che supporta nativamente gli elenchi come tipo di valore.

Altri suggerimenti

Questa carenza di ConfigParser è il motivo per cui pyglet utilizzato versione modificata di epydoc per sostituire ConfigParser ini con questo formato semplice :

name: pyglet
url: http://www.pyglet.org/

output: html
target: doc/api/
...    
module: pyglet

exclude: pyglet.gl.gl
exclude: pyglet.gl.agl
exclude: pyglet.gl.lib_agl
exclude: pyglet.gl.wgl
...

Se non hai bisogno di sezioni, questo approccio può essere utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top