Préserver le cas dans ConfigParser?
-
05-07-2019 - |
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')]
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 .