J'ai essayé d'utiliser le module ConfigParser de Python pour enregistrer les paramètres. Pour mon application, il est important que je préserve la casse de chaque nom dans mes sections. La documentation mentionne que passer str () à ConfigParser.optionxform () accomplirait 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 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')]
Pour moi, j'ai travaillé à définir optionxform immédiatement après la création de l'objet
la source
ConfigParser.ConfigParser()
Ajoutez à votre code:
config.optionxform = lambda option: option # preserve case for letters
la source
config.optionxform=str
la mieux notée - voir la ligne :) juste au lieu de votre lamdba @Martin v. Löwis utilise unestr
fonction intégréeJe sais que cette question a une réponse, mais j'ai pensé que certaines personnes pourraient trouver cette solution utile. C'est 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 celle de ConfigParser normal.
C'est ainsi que vous évitez d'avoir à définir optionxform à chaque fois que vous en faites un nouveau
ConfigParser
, ce qui est assez fastidieux.la source
optionxform
s'agit simplement d'une méthode sur leRawConfigParser
, si vous allez jusqu'à créer votre propre sous-classe, vous devriez plutôt remplacer la méthode sur la sous-classe plutôt que de la redéfinir par instanciation:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Caveat:
Si vous utilisez les 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:
toutes vos options du ou des fichiers de configuration conserveront leur casse, mais
FOO_BAZ
seront converties en minuscules.Pour que les valeurs par défaut conservent également leur casse, utilisez la sous-classification comme dans @icedtrees answer:
class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'})
Maintenant
FOO_BAZ
, gardez sa casse et vous n'aurez pas InterpolationMissingOptionError .la source