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')]
ドキュメントはわかりにくいです。彼らが意味するのはこれです:
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を呼び出す代わりにオーバーライドします。オーバーライドは、サブクラスまたはインスタンスで実行できます。オーバーライドするときは、(関数を呼び出した結果ではなく)関数に設定します。
これはバグとして と報告しましたが、その後修正されました。
私にとっては、オブジェクトを作成した直後にoptionxformを設定するために働いた
config = ConfigParser.RawConfigParser()
config.optionxform = str
コードに追加します。
config.optionxform = lambda option: option # preserve case for letters
私はこの質問に答えていることを知っていますが、一部の人々はこのソリューションが役立つと思うかもしれません。これは、既存のConfigParserクラスを簡単に置き換えることができるクラスです。
@OozeMeisterの提案を組み込むように編集:
class CaseConfigParser(ConfigParser):
def optionxform(self, optionstr):
return optionstr
使用法は通常のConfigParserと同じです。
parser = CaseConfigParser()
parser.read(something)
これにより、新しいConfigParser
を作成するたびにoptionxformを設定する必要がなくなります。これは面倒です。
警告:
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にはなりません。