Intenté usar el módulo ConfigParser de Python para guardar la configuración. Para mi aplicación, es importante que conserve 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 están todos en minúsculas. ¿Me estoy perdiendo de algo?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
Pseudocódigo de Python 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')]
Para mí, funcionó para configurar optionxform inmediatamente después de crear el objeto
fuente
ConfigParser.ConfigParser()
Agregue a su código:
config.optionxform = lambda option: option # preserve case for letters
fuente
config.optionxform=str
:) solo que en lugar de su lamdba @Martin v. Löwis usa lastr
función incrustadaSé 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 ConfigParser normal.
Esto es para evitar tener que configurar optionxform cada vez que crea una nueva
ConfigParser
, lo cual es algo tedioso.fuente
optionxform
es solo un método en elRawConfigParser
, si va a ir tan lejos como para crear su propia subclase, en su lugar debe anular el método en la subclase en lugar de redefinirlo por instanciación:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Consideración:
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:
todas sus opciones de los archivos de configuración mantendrán su caso, pero
FOO_BAZ
se convertirán a minúsculas.Para que los valores predeterminados también mantengan su caso, use subclases como en la respuesta de @icedtrees:
class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'})
Ahora
FOO_BAZ
mantendrá su caso y no tendrá InterpolationMissingOptionError .fuente