web-dev-qa-db-fra.com

Conserver le cas dans ConfigParser?

J'ai essayé d'utiliser le module ConfigParser de Python pour enregistrer les paramètres. Pour mon application, il est important que je conserve la casse de chaque nom dans mes sections. Les documents mentionnent que passer str () à ConfigParser.optionxform () accomplirait cela, mais cela ne fonctionne pas pour moi. Les noms sont tous en minuscules. Suis-je en train de manquer quelque chose?

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

Pseudocode Python de ce que j'obtiens:

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

La documentation est déroutante. Ils veulent dire ceci:

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

C'est à dire. remplacer optionxform, au lieu de l'appeler; la substitution peut être effectuée dans une sous-classe ou dans l'instance. Lors de la substitution, définissez-le sur une fonction (plutôt que sur le résultat de l'appel d'une fonction).

J'ai maintenant signalé ceci comme un bug , et il a depuis été corrigé.

93
Martin v. Löwis

Pour moi, j'ai travaillé pour définir optionxform immédiatement après la création de l'objet

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

Ajoutez à votre code:

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

Je sais que cette question reçoit une réponse, mais j'ai pensé que certaines personnes pourraient trouver cette solution utile. Il s'agit d'une classe qui peut facilement remplacer la classe ConfigParser existante.

Modifié pour intégrer la suggestion de @ OozeMeister:

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

L'utilisation est la même que ConfigParser normale.

parser = CaseConfigParser()
parser.read(something)

Ainsi, vous évitez d'avoir à définir optionxform chaque fois que vous créez un nouveau ConfigParser, ce qui est un peu fastidieux.

3
icedtrees

Caveat:

Si vous utilisez des valeurs par défaut avec ConfigParser, c'est-à-dire:

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

puis essayez de rendre l'analyseur sensible à la casse en utilisant ceci:

config.optionxform = str

toutes vos options du ou des fichiers de configuration conserveront leur casse, mais FOO_BAZ sera converti en minuscules.

Pour que les valeurs par défaut conservent également leur cas, utilisez le sous-classement comme dans la réponse @icedtrees:

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

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

Maintenant FOO_BAZ gardera sa casse et vous n'aurez pas InterpolationMissingOptionError.

2
nidalpres