114 votes

Conserver la casse 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. La documentation mentionne que passer str() à ConfigParser.optionxform() permettrait d'y parvenir, mais ça ne fonctionne pas pour moi. Les noms sont tous en minuscules. Est-ce que j'ai oublié quelque chose?

<~/.myrc contenu>
[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')]

135voto

Martin v. Löwis Points 61768

La documentation est confuse. Ce qu'ils veulent dire, c'est 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 écraser optionxform, au lieu de l'appeler; l'écrasement peut être fait dans une sous-classe ou dans l'instance. Lors de l'écrasement, définissez-le sur une fonction (plutôt que sur le résultat de l'appel d'une fonction).

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

0 votes

Merci. Ça fonctionne, et je suis d'accord que la documentation est confuse.

64voto

ulitosCoder Points 161

Pour moi, cela a fonctionné en définissant optionxform immédiatement après la création de l'objet

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

3 votes

Fonctionne très bien ! (notez que en python 3 c'est le nom de classe "configparser" (sans majuscule)

2 votes

@NoamManos: Vous faites référence au nom du module (le nom de la classe est toujours ConfigParser).

6 votes

Notez que cela fonctionne également avec ConfigParser.ConfigParser()

17voto

foo bar Points 747

Ajoutez à votre code :

config.optionxform = lambda option: option  # préserver la casse des lettres

1 votes

Cela semble fonctionner pour moi au moins en python 2.7 et c'est beaucoup plus propre que la réponse acceptée. Merci foo!

2 votes

C'est la même chose que la réponse la mieux notée - voir la ligne config.optionxform=str :) juste au lieu de votre lamdba @Martin v. Löwis utilise la fonction intégrée str

0 votes

@xuthus - En effet, vous pouvez utiliser 11 lignes de code au lieu de 1 ligne. Comme vous voulez.

7voto

icedtrees Points 1145

Je sais que cette question est répondue, mais je pensais que certaines personnes pourraient trouver cette solution utile. Ceci est une classe qui peut facilement remplacer la classe existante ConfigParser.

Modifié pour incorporer la suggestion de @OozeMeister:

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

L'utilisation est la même que pour un ConfigParser normal.

parser = CaseConfigParser()
parser.read(something)

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

0 votes

Depuis que optionxform est juste une méthode sur le RawConfigParser, si vous allez jusqu'à créer votre propre sous-classe, vous devriez plutôt remplacer la méthode dans la sous-classe plutôt que de la redéfinir par instanciation : class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr

0 votes

@OozeMeister super idée!

4voto

nidalpres Points 696

Avertissement:

Si vous utilisez les paramètres par défaut avec ConfigParser, c'est-à-dire:

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

et ensuite essayez de rendre le parseur sensible à la casse en utilisant ceci:

config.optionxform = str

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

Pour que les paramètres par défaut conservent également leur casse, utilisez l'héritage de classe comme dans la réponse de @icedtrees:

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

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

Maintenant, FOO_BAZ conservera sa casse et vous n'aurez pas d'InterpolationMissingOptionError.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X