Question

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 la transmission de str () à ConfigParser.optionxform () pourrait accomplir cela, mais cela ne fonctionne pas pour moi. Les noms sont tous en minuscules. Est-ce que je manque quelque chose?

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

Pseudocode Python de ce que je reçois:

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')]
Était-ce utile?

La solution

La documentation est déroutante. 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')

I.e. substitue optionxform, au lieu de l'appeler; le remplacement peut être effectué dans une sous-classe ou dans l'instance. Lors du remplacement, définissez-le sur une fonction (plutôt que sur le résultat de l'appel d'une fonction).

Je viens maintenant de signaler ceci comme un bogue , qui a depuis été corrigé.

Autres conseils

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 

Ajouter à votre code:

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

Je sais que cette question a reçu 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 identique à celle de ConfigParser normal.

parser = CaseConfigParser()
parser.read(something)

Vous évitez ainsi de définir optionxform chaque fois que vous créez un nouveau ConfigParser , ce qui est fastidieux.

Avertissement:

Si vous utilisez les paramètres 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 des fichiers de configuration conserveront leur casse, mais FOO_BAZ sera converti en minuscule.

Pour que les valeurs par défaut soient également conservées, utilisez des sous-classes, comme dans @icedtrees, répondez:

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 plus InterpolationMissingOptionError .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top