2010-10-28 13 views
9

Mi piacerebbe utilizzare sia il tempo di analisi che l'interpolazione di runtime per i valori di un file di configurazione configobj. Il modo più semplice per eseguire un'interpolazione di stringa semplice in Python è "%(foo)s" % somedict. Sfortunatamente configobj usa lo stesso meccanismo di interpolazione e non ho ancora trovato un modo per evitarlo. Idealmente il mio valore sarebbe simile:Come uscire da un segno% in un valore configobj?

othervar = foo 
someconfigobjkey = %(othervar)s %%(runtimevar)s 

Tuttavia configobj tentativi (e fallisce) per sostituire la seconda variabile. Un altro modo per rispondere a questa domanda è fornire un modo diverso (configobj) per eseguire sia l'analisi che l'interpolazione di runtime.

risposta

1

Nuova versione della risposta:

Si potrebbe usare "" .format() (Python 2.6 o superiore) o string.Template (Python 2.4 o superiore) per l'interpolazione di runtime - entrambi i quali eliminerebbe il conflitto.

(La vecchia versione ha assunto l'utilizzo del modulo ConfigParser di serie, quindi i commenti.)

+0

Come ho detto nella mia domanda iniziale uso configobj e non ConfigParser Forse ho pensato che questo modulo fosse conosciuto troppo lontano lo si può trovare su http://www.voidspace.org.uk/python/configobj.html –

+0

Così rry, non conoscevo quel modulo e non lo riconoscevo come nome del modulo nel tuo post. Qualche ragione per non usare solo il modulo ConfigParser standard?Se ciò dovesse essere fatto anche per te, il problema verrebbe risolto :) –

+0

Nello sviluppo aziendale, la scelta degli strumenti non è sempre data. –

3

Sì, purtroppo configobj non segue le normali regole di formattazione standard di Python, in modo %%, che altrimenti sarebbero il modo corretto di sfuggire a un segno di percentuale, non riesce. Sembra un po 'un difetto di progettazione per me.

L'unico modo che posso pensare di avere un letterale %(foo)s sequenza in un valore configobj sarebbe garantire parte di tale sequenza è a sua volta genera un rimontaggio:

>>> import configobj 
>>> c= configobject.ConfigObj() 
>>> c['foo']= 'bar' 
>>> c['pc']= '%' 
>>> c['v']= '%(foo)s %(pc)s(foo)s' 
>>> c['v'] 
'bar %(foo)s' 
2

Scavando più profondo nella documentazione ho trovato una soluzione che si adatta meglio di quella proposta da bobince: utilizzare un motore di interpolazione diverso, ad esempio interpolation="template". Ha due vantaggi.

  1. Non interferisce con i segni%.
  2. Supporta l'escape. ($$ ottiene interpolata a $.)

L'esempio sarà simile:

othervar = foo 
someconfigobjkey = $othervar %(runtimevar)s 
+0

Questo è il metodo da usare! Si noti che 'cfg = configobj.ConfigObj (..., interpolation = 'template')' sembra non avere alcun effetto sulla convalida e un successivo 'cfg.validate (...)' non funzionerà ancora. Ciò che funziona è modificare l'interpolatore predefinito impostando 'configobj.DEFAULT_INTERPOLATION = 'template''. Funziona sia in Python 2 che in Python 3. –

3

Provare a usare '%' + '(foo) s'. Questo ha funzionato per me quando si trattava di ConfigParser.

8

Le cose potrebbero essere cambiate da quando è stata inviata questa domanda, ma ho scoperto che puoi sfuggire utilizzando il carattere '%'. Questo ha funzionato per me in Python 3.

Nel mio file config.ini:

[LOGGING] 
format = %%(asctime)-15s %%(message)s 

Nel mio file di script python:

import configparser 

# Load configuration 
config = configparser.ConfigParser() 
config.read("config.ini") 

log_config = config['LOGGING'] 

print(log_config['format']) # prints out '%(asctime)-15s %(message)s' 

Speranza che aiuta qualcuno in futuro (:

+0

Questo ha funzionato per me con SafeConfigParser! –