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')]
È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top