Conservare il caso in ConfigParser?
-
05-07-2019 - |
Domanda
Ho provato a utilizzare il modulo ConfigParser.optionxform () lo farebbe, ma non funziona per me. I nomi sono tutti in minuscolo. Mi sto perdendo qualcosa?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
Pseudocodice Python di ciò che ottengo:
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')]
Soluzione
La documentazione è confusa. Quello che vogliono dire è questo:
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')
vale a dire. sovrascrive optionxform, anziché chiamarlo; l'override può essere eseguito in una sottoclasse o nell'istanza. Quando si esegue l'override, impostarlo su una funzione (anziché sul risultato della chiamata a una funzione).
Ora ho segnalato questo come un bug , e da allora è stato corretto.
Altri suggerimenti
Per me ho lavorato per impostare optionxform immediatamente dopo aver creato l'oggetto
config = ConfigParser.RawConfigParser()
config.optionxform = str
Aggiungi al tuo codice:
config.optionxform = lambda option: option # preserve case for letters
So che questa domanda ha una risposta, ma ho pensato che alcune persone potrebbero trovare utile questa soluzione. Questa è una classe che può facilmente sostituire la classe ConfigParser esistente.
Modificato per incorporare il suggerimento di @ OozeMeister:
class CaseConfigParser(ConfigParser):
def optionxform(self, optionstr):
return optionstr
L'utilizzo è uguale al normale ConfigParser.
parser = CaseConfigParser()
parser.read(something)
In questo modo eviti di dover impostare optionxform ogni volta che crei un nuovo ConfigParser
, che è un po 'noioso.
Caveat:
Se si utilizzano le impostazioni predefinite con ConfigParser, ovvero:
config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})
e quindi prova a rendere il parser sensibile al maiuscolo / minuscolo usando questo:
config.optionxform = str
tutte le opzioni dei file di configurazione manterranno il loro caso, ma FOO_BAZ
sarà convertito in minuscolo.
Per fare in modo che anche le impostazioni predefinite mantengano il loro caso, utilizzare la sottoclasse come nella risposta @icedtrees:
class CaseConfigParser(ConfigParser.SafeConfigParser):
def optionxform(self, optionstr):
return optionstr
config = CaseConfigParser({'FOO_BAZ': 'bar'})
Ora FOO_BAZ
manterrà il caso e non avrai InterpolationMissingOptionError .