web-dev-qa-db-ja.com

ConfigParserで大文字と小文字を保持しますか?

Pythonの ConfigParser モジュールを使用して設定を保存しようとしました。私のアプリでは、各名前の大文字と小文字をセクションに保存することが重要です。ドキュメントでは、str()を ConfigParser.optionxform() に渡すことでこれを達成できると述べていますが、私には機能しません。名前はすべて小文字です。何か不足していますか?

<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz

私が得るもののPython擬似コード:

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')]
72
pojo

ドキュメントはわかりにくいです。彼らが意味するのはこれです:

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')

つまりoptionxformを呼び出す代わりにオーバーライドします。オーバーライドは、サブクラスまたはインスタンスで実行できます。オーバーライドするときは、(関数を呼び出した結果ではなく)関数に設定します。

これはバグとして と報告しましたが、その後修正されました。

93

私にとっては、オブジェクトを作成した直後にoptionxformを設定するために働いた

config = ConfigParser.RawConfigParser()
config.optionxform = str 
26
ulitosCoder

コードに追加します。

config.optionxform = lambda option: option  # preserve case for letters
5
foo bar

私はこの質問に答えていることを知っていますが、一部の人々はこのソリューションが役立つと思うかもしれません。これは、既存のConfigParserクラスを簡単に置き換えることができるクラスです。

@OozeMeisterの提案を組み込むように編集:

class CaseConfigParser(ConfigParser):
    def optionxform(self, optionstr):
        return optionstr

使用法は通常のConfigParserと同じです。

parser = CaseConfigParser()
parser.read(something)

これにより、新しいConfigParserを作成するたびにoptionxformを設定する必要がなくなります。これは面倒です。

3
icedtrees

警告:

ConfigParserでデフォルトを使用する場合、つまり:

config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})

そして、これを使用してパーサーの大文字と小文字を区別しようとします:

config.optionxform = str

設定ファイルからのすべてのオプションは大文字小文字を保持しますが、FOO_BAZは小文字に変換されます。

デフォルトでも大文字と小文字を区別するには、@ icedtrees answerのようなサブクラスを使用します。

class CaseConfigParser(ConfigParser.SafeConfigParser):
    def optionxform(self, optionstr):
        return optionstr

config = CaseConfigParser({'FOO_BAZ': 'bar'})

FOO_BAZは大文字と小文字を保持し、InterpolationMissingOptionErrorにはなりません。

2
nidalpres