2010-10-28 11 views
9

Me gustaría utilizar el tiempo de análisis y la interpolación en tiempo de ejecución para los valores de un archivo de configuración configobj. La forma más sencilla de hacer una interpolación simple de cadenas en Python es "%(foo)s" % somedict. Desafortunadamente, configobj utiliza el mismo mecanismo de interpolación y todavía no he encontrado una forma de escapar de él. Mi valor ideal sería el siguiente:¿Cómo escapar de un signo% en un valor de configobj?

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

Sin embargo, configobj intenta (y no) reemplazar la segunda variable. Otra forma de responder a esta pregunta es proporcionar una forma diferente (configobj) para hacer el tiempo de análisis y la interpolación de tiempo de ejecución.

Respuesta

1

Nueva versión de la respuesta:

Se puede usar "" .formato() (Python 2.6 o superior) o string.Template (Python 2.4 o superior) para la interpolación de tiempo de ejecución - ambos de los cuales eliminaría el conflicto.

(La versión anterior supone el uso del módulo ConfigParser estándar, por lo tanto, los comentarios.)

+0

Como dije en mi pregunta inicial, uso configobj y no ConfigParser. Quizás asumí que este módulo es demasiado conocido, de todos modos se puede encontrar en http://www.voidspace.org.uk/python/configobj.html. –

+0

Asi que No sé ese módulo y tampoco lo reconocí como un nombre de módulo en tu publicación. ¿Alguna razón para no usar el módulo estándar ConfigParser?Si esto también lo hiciera por usted, el problema también se resolvería :) –

+0

En desarrollo corporativo, la elección de herramientas no siempre se da. –

3

Sí, por desgracia configobj no sigue las reglas de formato estándar de Python normales, por lo que %%, que de otro modo sería la forma correcta escapar de un signo de porcentaje, falla. Me parece un defecto de diseño.

La única manera que puedo pensar en tener una secuencia literal %(foo)s en un valor configobj sería asegurar parte de esa secuencia está a su vez genera un reemplazo:

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

Profundizando en la documentación que encontré una solución que se ajusta mejor que la propuesta por bobince: utilice un motor de interpolación diferente, como interpolation="template". Tiene dos ventajas.

  1. No interfiere con% signs.
  2. Compatible con escapes. ($$ consigue interpolado a $.)

El ejemplo se vería así:

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

¡Este es el método a usar! Tenga en cuenta que 'cfg = configobj.ConfigObj (..., interpolation = 'template')' parece no tener ningún efecto en la validación y un posterior 'cfg.validate (...)' fallará aún. Lo que funciona es cambiar el interpolador predeterminado estableciendo 'configobj.DEFAULT_INTERPOLATION = 'template''. Esto funciona tanto en Python 2 como en Python 3. –

3

Trate de usar '%' + '(foo) s'. Eso funcionó para mí cuando se trata de ConfigParser.

8

Las cosas pueden haber cambiado desde que se publicó esta pregunta, pero descubrí que puede evitar el uso del carácter '%'. Esto funcionó para mí en Python 3.

En mi archivo config.ini:

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

En mi archivo de 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' 

espero que ayude a alguien en el futuro (:

+0

¡Esto funcionó para mí con SafeConfigParser! –

Cuestiones relacionadas