2010-08-09 14 views
20

Quale è meglio per la creazione di un file di impostazioni per i programmi Python, il modulo incorporato (ConfigParser) o il progetto indipendente (ConfigObj) o il formato di serializzazione dati YAML? Ho sentito che ConfigObj è più facile da usare rispetto a ConfigParser, anche se non è una libreria integrata. Ho anche letto che PyYAML è facile da usare, sebbene YAML abbia bisogno di un po 'di tempo. Facilità di implementazione a parte, qual è l'opzione migliore per la creazione di un file di impostazioni/configurazione?ConfigObj/ConfigParser rispetto all'utilizzo di YAML per il file di impostazioni Python

risposta

8

Utilizzo di ConfigObj è almeno molto semplice e file ini generali sono molto più semplici (e più ampiamente utilizzati) di YAML. Per i casi più complessi, tra cui la convalida, i valori ei tipi predefiniti, ConfigObj fornisce un modo per farlo attraverso la convalida di configspec.

semplice codice per leggere un file INI con ConfigObj:

from configobj import ConfigObj 

conf = ConfigObj('filename.ini') 
section = conf['section'] 
value = section['value'] 

Gestisce automaticamente i valori di lista per voi e consente valori multilinea. Se si modifica il file di configurazione, è possibile riscriverlo preservando l'ordine e i commenti.

vedere questi articoli per maggiori informazioni, inclusi esempi di convalida del tipo:

5

ConfigParser ha un'API davvero pessima, ConfigObj dovrebbe essere buono ma non l'ho mai usato, per i file ini di solito implemento il mio parser.

Tuttavia i formati ini-like non gestiscono bene tipi diversi, sequenze o mappature ricorsive, quindi dovrei semplicemente usare yaml. È facile da leggere e modificare con un editor, c'è uno standard per l'analisi di quei file e non hai nessuno dei suddetti aspetti negativi che i formati ini-like hanno.

+3

ConfigObj gestisce tipi e sequenze :-) – fuzzyman

6

Dipende da ciò che si desidera memorizzare nel vostro config file e come li si usa

  • Se si esegue il round trip (codice yaml → → yaml) e si desidera conservare i commenti non è possibile utilizzare PyYAML o ConfigParser.

  • Se si desidera mantenere l'ordine delle chiavi (ad esempio quando si controlla nei file di configurazione), PyYAML non lo fa se non si specifica !!omap (che lo rende meno facile da aggiornare di una mappatura normale)

  • Se si desidera avere strutture complesse con elenchi di elementi senza nome contenenti mapping/dizionari, quindi ConfigParser e ConfigObj non saranno di aiuto come le coppie di valori-chiave dei file INI devono andare in sezioni e gli elenchi possono essere solo valori.

L'implementazione di ruamel.yaml del lettore YAML supporta tutto quanto sopra ¹. Ho usato l'eccellente ConfigObj di fuzzyman per la preservazione dei commenti di andata e ritorno per molto tempo, così come PyYAML per strutture più complesse e questo combina il meglio di entrambi i mondi.ruamel.yaml include l'utilità yaml in grado di convertire i file INI ConfigObj a YAML


¹ ruamel.yaml è una libreria che supporta YAML YAML 1.2 (vi consiglio di usare, ma poi io sono l'autore del pacchetto). PyYAML supporta solo (la maggior parte) YAML 1.1.

+0

grazie per aver segnalato ruamel.yaml. – jgomo3

+1

Mi manca un disclaimer che l'autore di questo post sia anche l'autore del 'ruamel.yaml'. – xmedeko

+0

@xmedeko è il punto in cui si riferisce il '(plug spudorato), ma ammetto che dovrebbe essere più esplicito (come ho fatto nelle risposte successive, come [qui] (http://stackoverflow.com/a/29415791/ 1307905) e [qui] (http://stackoverflow.com/a/36631057/1307905) Questa risposta proviene da subito dopo aver iniziato a pubblicare ruamel.yaml. – Anthon