estoy usando ConfigParser para cargar los datos de un archivo de configuración de la siguiente manera:Cómo excluir DEFAULT de 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')
salida :
$ python load.py
[('datadir', '/tmp'), ('filetwo', '/tmp/nudderfile.foo'), ('fileone', '/tmp/somefile.foo')]
/tmp
Me sorprende que los valores predeterminados para la sustitución de variables ('datadir', '/tmp')
aparezcan como parte de. items()
y .get()
devuelve, como si fueran valores en el archivo de configuración. ¿Se espera este comportamiento? Cualquier solución alternativa, de modo que simplemente puedo iterar .items()
sin obtener los valores de diccionario predeterminados allí, pero aún utilizando la interpolación mágica?
Referencia: http://docs.python.org/library/configparser.html
Gracias!
Actualización: Se ha señalado que este es el comportamiento esperado: los valores predeterminados son como cualquier otro par nombre/valor en el archivo de configuración. Del mismo modo, los pares de nombre/valor en el archivo de configuración también están disponibles para "interpolación mágica", por lo que si defino:
foo: bar
zap: %(foo)snowl
Voy a [... ('zap': 'barnowl')]
Eso es bastante limpio, pero todavía estoy preguntándome si puedo lograr lo que quiero lograr: iterar sobre los pares nombre/valor en mis archivos de configuración, con la interpolación de variables, sin los valores predeterminados.
Mi situación específica es esta: quise inicializar el objeto config con algo como {basedir: '/foo/bar'}
, ya que las rutas absolutas a ciertos archivos varían según la instalación. Entonces necesito pasar ese objeto de configuración y tener varias otras clases iterar a través de los archivos. No quiero que todas las clases que lean la configuración tengan que saber que se inicializó con ciertos valores predeterminados y que debe ignorarlos, ya que no son archivos reales. es posible? ¿Alguna manera de ocultar los valores predeterminados de .item() y .get() pero todavía tienen interpolación? ¡Gracias!
No puedo entender por qué este es el comportamiento por defecto, y mucho menos por qué no hay manera de apagarlo. –