¿Conservar caso en ConfigParser?

He intentado usar el módulo ConfigParser de Python para guardar la configuración. Para mi aplicación es importante que guarde el caso de cada nombre en mis secciones. Los documentos mencionan que pasar str () a ConfigParser.optionxform () lograría esto, pero no funciona para mí. Los nombres son todos en minúscula. ¿Me estoy perdiendo de algo?

 [rules] Monkey = foo Ferret = baz 

Python pseudocódigo de lo que obtengo:

 import ConfigParser,os def get_config(): config = ConfigParser.ConfigParser() config.optionxform(str()) try: config.read(os.path.expanduser('~/.myrc')) return config except Exception, e: log.error(e) c = get_config() print c.options('rules') [('monkey', 'foo'), ('ferret', 'baz')] 

La documentación es confusa. Lo que quieren decir es esto:

 import ConfigParser, os def get_config(): config = ConfigParser.ConfigParser() config.optionxform=str try: config.read(os.path.expanduser('~/.myrc')) return config except Exception, e: log.error(e) c = get_config() print c.options('rules') 

Es decir, sobrescribe optionxform, en lugar de llamarlo; La anulación se puede hacer en una subclase o en la instancia. Al anular, configúrelo en una función (en lugar del resultado de llamar a una función).

Ahora he reportado esto como un error , y desde entonces ha sido corregido.

Para mí, trabajé para configurar optionxform inmediatamente después de crear el objeto.

 config = ConfigParser.RawConfigParser() config.optionxform = str 

Agregue a su código:

 config.optionxform = lambda option: option # preserve case for letters 

Sé que esta pregunta está respondida, pero pensé que algunas personas podrían encontrar útil esta solución. Esta es una clase que puede reemplazar fácilmente la clase ConfigParser existente.

Editado para incorporar la sugerencia de @ OozeMeister:

 class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr 

El uso es el mismo que el ConfigParser normal.

 parser = CaseConfigParser() parser.read(something) 

Esto es para evitar tener que configurar optionxform cada vez que ConfigParser un ConfigParser nuevo, lo cual es un poco tedioso.

Advertencia:

Si usa valores predeterminados con ConfigParser, es decir:

 config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'}) 

y luego intente hacer que el analizador distinga entre mayúsculas y minúsculas usando esto:

 config.optionxform = str 

todas las opciones de los archivos de configuración conservarán su caso, pero FOO_BAZ se convertirá en minúsculas.

Para que los valores predeterminados también conserven su caso, use subclases como en la respuesta @icedtrees:

 class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'}) 

Ahora FOO_BAZ mantendrá su caso y usted no tendrá InterpolationMissingOptionError .