Sto usando ConfigParser per caricare dati da un file di configurazione come segue:Come escludere i DEFAULT da Python ConfigParser .items()?
test.conf:
[myfiles]
fileone: %(datadir)s/somefile.foo
filetwo: %(datadir)s/nudderfile.foo
load.py:
import ConfigParser
config = ConfigParser.ConfigParser({'datadir': '/tmp'})
config.read('test.conf')
print config.items('myfiles')
print config.get('myfiles', 'datadir')
uscita :
$ python load.py
[('datadir', '/tmp'), ('filetwo', '/tmp/nudderfile.foo'), ('fileone', '/tmp/somefile.foo')]
/tmp
Sono sorpreso che i valori predefiniti per la sostituzione variabile ('datadir', '/tmp')
vengano visualizzati come parte del. items()
e .get()
restituisce, come se fossero valori nel file di configurazione. È previsto questo comportamento? Qualche soluzione di lavoro, in modo che io possa semplicemente iterare .items()
senza ottenere i valori del dizionario predefinito in là, ma usando ancora l'interpolazione magica?
Riferimento: http://docs.python.org/library/configparser.html
Grazie!
Aggiornamento: È stato sottolineato che questo è il comportamento previsto: i valori predefiniti sono proprio come qualsiasi altra coppia nome/valore nel file di configurazione. Allo stesso modo, le coppie nome/valore nel file di configurazione sono disponibili anche per "interpolazione magica", quindi se mi definisco:
foo: bar
zap: %(foo)snowl
Prendo [... ('zap': 'barnowl')]
Questo è abbastanza pulito, ma io sono ancora chiedendo se riesco a realizzare ciò che voglio realizzare: iterare sulle coppie nome/valore nei miei file di configurazione, con interpolazione di variabili, senza i valori predefiniti.
Il mio scenario specifico è questo: ho voluto inizializzare l'oggetto config con qualcosa come {basedir: '/foo/bar'}
, poiché i percorsi assoluti per determinati file variano a seconda dell'installazione. Poi ho bisogno di passare questo oggetto di configurazione e avere varie altre classi iterare attraverso i file. Non voglio che ogni classe che legge la configurazione debba sapere che è stata inizializzata con determinate impostazioni predefinite e che dovrebbe ignorarle, poiché non sono file reali. È possibile? C'è un modo per nascondere i valori predefiniti da .item() e .get() ma hanno ancora un'interpolazione? Grazie!
Non riesco a capire il motivo per cui questo è il comportamento di default, e tanto meno il motivo per cui non c'è modo per spegnerlo. –