Préserver cas dans ConfigParser?
J'ai essayé d'utiliser Python ConfigParser module pour enregistrer les paramètres. Pour mon application, il est important de préserver le cas de chaque nom dans mes sections. La documentation mentionne qu'en passant str() pour ConfigParser.optionxform() allait accomplir cela, mais il ne fonctionne pas pour moi. Les noms sont en minuscules. Ai-je raté quelque chose?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
Python pseudocode 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')]
Vous devez vous connecter pour publier un commentaire.
La documentation est source de confusion. Ce qu'ils veulent dire est ceci:
I. e. remplacer optionxform, au lieu de l'appeler; substituant qui peut être fait dans une sous-classe ou dans l'instance. Lors de la substitution, définir une fonction (plutôt que le résultat de l'appel d'une fonction).
J'ai maintenant signalé cela comme un bug, et il a depuis été corrigé.
Pour moi travaillé pour définir optionxform immédiatement après la création de l'objet
ConfigParser.ConfigParser()
Ajouter à votre code:
Je sais répondre à cette question, mais je pensais que certaines personnes pourraient trouver cette solution utile. C'est une classe qui peut facilement remplacer le ConfigParser classe.
Modifié pour intégrer @OozeMeister suggestion:
Utilisation est la même que la normale ConfigParser.
Il en est ainsi vous éviter d'avoir à mettre en optionxform chaque fois que vous effectuez une nouvelle
ConfigParser
, ce qui est assez fastidieux.optionxform
est juste une méthode sur laRawConfigParser
, si vous allez à aller aussi loin que de créer votre propre sous-classe, il est préférable de substituer la méthode de la sous-classe plutôt que de la redéfinir par l'instanciation:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Mise en garde:
Si vous utilisez les valeurs par défaut avec ConfigParser, c'est à dire:
et puis essayez de faire de l'analyseur sensible à la casse en utilisant ce:
toutes vos options du fichier de configuration(s) gardent leur cas, mais
FOO_BAZ
seront convertis en minuscules.D'avoir des valeurs par défaut aussi garder leur cas, l'utilisation de sous-classement comme dans @icedtrees réponse:
Maintenant
FOO_BAZ
gardera c'est le cas et que vous n'aurez pas InterpolationMissingOptionError.