2010-03-29 4 views
7

Ho configurato un logger python, usando il modulo di registrazione di python. Voglio memorizzare la stringa che sto usando con l'oggetto di formattazione della registrazione in un file di configurazione usando il modulo ConfigParser.È possibile disabilitare temporaneamente l'interpolazione delle stringhe di Python?

La stringa di formato è memorizzata in un dizionario di impostazioni in un file separato che gestisce la lettura e la scrittura del file di configurazione. Il problema che ho è che python tenta ancora di formattare il file e cade quando legge tutti i flag di formattazione specifici del modulo di log.

{ 
    "log_level":logging.debug, 
    "log_name":"C:\\Temp\\logfile.log", 
    "format_string": 
     "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s" 
} 

La mia domanda è semplice: come posso disabilitare qui la funzionalità di formattazione mantenendola altrove. La mia reazione iniziale è stata l'uso copioso del backslash per sfuggire ai vari simboli delle percentuali, ma questo naturalmente rompe in modo permanente la formattazione in modo che non funzioni anche quando ne ho bisogno.

Vorrei anche menzionare, poiché è stato acquistato nei commenti, che ConfigParser esegue un'interpolazione interna che causa il trip-up. Ecco il mio traceback:

Traceback (most recent call last): 
    File "initialconfig.py", line 52, in <module> 
    "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s" 
    File "initialconfig.py", line 31, in add_settings 
    self.set(section_name, setting_name, default_value) 
    File "C:\Python26\lib\ConfigParser.py", line 668, in set 
    "position %d" % (value, m.start())) 
ValueError: invalid interpolation syntax in '%(asctime)s %(levelname)s: %(module 
)s, line %(lineno)d - %(message)s' at position 10 

Inoltre, le indicazioni generali su buone pratiche di file di impostazioni sarebbero buone. Questa è la prima volta che faccio qualcosa di significativo con ConfigParser (o registro per quella materia).

Grazie in anticipo, Dominic

+0

interpolazione? Penso che la parola giusta sarebbe la formattazione –

+0

@Edison: No, in Python si chiama anche interpolazione. http://docs.python.org/library/stdtypes.html#string-formatting-operations –

+0

I'm confused - la formattazione si verifica solo quando si chiede esplicitamente di farlo tramite '%' [o 'string.substitute () ']. –

risposta

10

Hai provato a fuggire percentuali con %%?

+3

Si scopre che si tratta di un bug in Python 2.6.2. L'aggiornamento a 2.6.5 ha risolto il problema. Questo fa esattamente ciò che è richiesto. – dangerouslyfacetious

1

Qual è il problema con il codice sopra? L'interpolazione viene eseguita solo se l'operatore % viene applicato alla stringa. Se non si utilizza %, è possibile utilizzare la stringa di formattazione come qualsiasi altra stringa.

+0

Avrei dovuto accennare: il modulo ConfigParser esegue internamente un'interpolazione di stringhe ed è qui che scatta. Modificherò la mia domanda con il traceback per chiarezza. – dangerouslyfacetious

9

Si potrebbe voler utilizzare ConfigParser.RawConfigParser anziché ConfigParser.ConfigParser. Solo quest'ultimo interpola magicamente sui valori di configurazione.

EDIT:

In realtà, utilizzando ConfigParser.SafeConfigParser sarete in grado di sfuggire stringhe di formato con un ulteriore segno % per cento. Questo esempio dovrebbe funzionare allora:

{ 
    "log_level":logging.debug, 
    "log_name":"C:\\Temp\\logfile.log", 
    "format_string": 
     "%%(asctime)s %%(levelname)s: %%(module)s, line %%(lineno)d - %%(message)s" 
} 
+0

Ha funzionato. Ma cosa succede quando ho bisogno di usare le funzioni di interpolazione? – dangerouslyfacetious

+0

vedere la mia parte aggiornata della risposta. – Haes

5

C'è RawConfigParser che è come ConfigParser senza il comportamento di interpolazione. Se non si utilizza la funzione di interpolazione in nessuna altra parte del file di configurazione, è possibile semplicemente sostituire ConfigParser con RawConfigParser nel codice.

Vedere la documentazione di RawConfigParser per ulteriori dettagli.

2

È anche possibile utilizzare l'interpolazione impostato None.

config = ConfigParser(strict=False, interpolation=None) 

(sto usando Python 3.6.0)