2010-03-29 23 views
7

Tengo un registrador de Python configurado, usando el módulo de registro de python. Quiero almacenar la cadena que estoy utilizando con el objeto de registro de formateador en un archivo de configuración utilizando el módulo ConfigParser.¿Es posible desactivar temporalmente la interpolación de cadenas de Python?

La cadena de formato se almacena en un diccionario de configuraciones en un archivo separado que maneja la lectura y escritura del archivo de configuración. El problema que tengo es que Python todavía intenta formatear el archivo y se cae cuando lee todos los indicadores de formato específicos del módulo de registro.

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

Mi pregunta es simple: cómo puedo desactivar la funcionalidad de formateo aquí mientras la guardo en otro lugar. Mi reacción inicial fue el uso abundante de la barra diagonal inversa para escapar de los diversos símbolos de porcentaje, pero eso por supuesto rompe el formateo de forma permanente, de modo que no funcionará incluso cuando lo necesite.

Debo mencionar también, ya que se compró en los comentarios, que ConfigParser hace alguna interpolación interna que causa el tropiezo. Aquí está mi 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 

Además, los consejos generales sobre buenas prácticas de archivos de configuración serían agradables. Esta es la primera vez que hago algo significativo con ConfigParser (o registro para ese asunto).

Gracias de antemano, Dominic

+0

interpolación? Creo que la palabra correcta sería formatear –

+0

@ Edison: No, en Python también se llama interpolación. http://docs.python.org/library/stdtypes.html#string-formatting-operations –

+0

Estoy confundido: el formateo solo ocurre cuando explícitamente le pides que lo haga a través de '%' [o 'string.substitute () ']. –

Respuesta

10

¿trató de escapar por ciento con %%?

+3

Resulta que fue un error en Python 2.6.2. La actualización a 2.6.5 solucionó el problema. Esto hace exactamente lo que se requiere. – dangerouslyfacetious

1

¿Cuál es el problema con el código anterior? La interpolación solo se realiza si el operador % se aplica a la cadena. Si no usa %, puede usar la cadena de formato como cualquier otra cadena.

+0

Debería haber mencionado: el módulo ConfigParser hace una interpolación de cadenas internamente y es allí donde se activa. Editaré mi pregunta con el rastreo para mayor claridad. – dangerouslyfacetious

9

Es posible que desee utilizar ConfigParser.RawConfigParser en lugar de ConfigParser.ConfigParser. Solo este último realiza una interpolación mágica en los valores de configuración.

EDIT:

En realidad, el uso de ConfigParser.SafeConfigParser podrás capaz de escapar de las cadenas de formato con un signo adicional % por ciento. Este ejemplo debería estar trabajando a continuación:

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

Eso funcionó. ¿Pero qué sucede cuando necesito usar las funciones de interpolación? – dangerouslyfacetious

+0

ver mi parte actualizada de la respuesta. – Haes

5

Hay RawConfigParser que es como ConfigParser sin el comportamiento de interpolación. Si no usa la función de interpolación en ninguna otra parte del archivo de configuración, simplemente puede reemplazar ConfigParser con RawConfigParser en su código.

Consulte la documentación de RawConfigParser para obtener más información.

2

También puede utilizar la interpolación se establece en None.

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

(estoy usando Python 3.6.0)

Cuestiones relacionadas