2009-10-23 10 views
54

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() lo lograría, pero no funciona para mí. Los nombres son todos minúsculos. ¿Me estoy perdiendo de algo?¿Conservar caso en ConfigParser?

<~/.myrc contents> 
[rules] 
Monkey = foo 
Ferret = baz 

Python pseudocódigo de lo que me sale:

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')] 

Respuesta

73

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') 

I.e. anular optionxform, en lugar de llamarlo; anulación se puede hacer en una subclase o en la instancia. Al anular, configúrelo para una función (en lugar de como resultado de llamar a una función).

He informado this as a bug, y ha sido reparado.

+0

Gracias. Funciona, y acepto que los documentos son confusos. – pojo

+4

+1 por informar el error – Tshepang

2

Sé que se responde a esta pregunta, pero creo que a algunas personas les puede resultar ú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.

parser = CaseConfigParser() 
parser.read(something) 

Esto es lo que se evitan tener que configurar optionxform cada vez que realice una nueva ConfigParser, que es un poco tedioso.

+0

Dado que 'optionxform' es solo un método en' RawConfigParser', si vas a crear tu propia subclase, debes reemplazar el método en la subclase en lugar de redefinirlo por instanciación: 'clase CaseConfigParser (ConfigParser): def optionxform (self, optionstr): return optionstr' – OozeMeister

+0

@OozeMeister ¡gran idea! – icedtrees

20

Para mí trabajaron para establecer optionxform inmediatamente después de crear el objeto

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

¡Funciona muy bien! (tenga en cuenta que en Python 3 es el nombre de la clase "configparser" (sin mayúsculas) –

+0

@NoamManos: se refiere al nombre del módulo (el nombre de la clase sigue siendo [ConfigParser] (https://docs.python.org/3/ library/configparser.html # configparser.ConfigParser)). –

+0

Tenga en cuenta que también funciona con 'ConfigParser.ConfigParser()' –

0

Advertencia:

Si utiliza los valores predeterminados con ConfigParser, es decir:

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

y luego tratar de hacer el analizador de mayúsculas y minúsculas al usar esto:

config.optionxform = str 

todas sus opciones de archivo (s) de configuración mantendrán su caso, pero FOO_BAZ se convertirán a minúsculas.

Para tener valores predeterminados también mantienen su caso, el uso de subclases como en @icedtrees responder:

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

config = CaseConfigParser({'FOO_BAZ': 'bar'}) 

Ahora FOO_BAZ mantendrá es el caso y usted no tendrá InterpolationMissingOptionError.

Cuestiones relacionadas