python - read - ¿Conservar caso en ConfigParser?
python configparser read (5)
He intentado 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 son todos en minúscula. ¿Me estoy perdiendo de algo?
<~/.myrc contents>
[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'')]
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 sus opciones de archivos de configuración mantendrán su caso, pero FOO_BAZ
se convertirá a minúsculas.
Para que los valores predeterminados también mantengan 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 .
Agregue a su código:
config.optionxform = lambda option: option # preserve case for letters
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, anular 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
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.