ConfigParserでケースを保持しますか?


90

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

回答:


114

ドキュメントは紛らわしいです。彼らが意味するのはこれです:

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

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


ありがとうございました。それは機能し、ドキュメントが混乱していることに同意します。
pojo

39

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

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

2
よく働く!(Python 3では「configparser」クラス名(大文字なし)であることに注意してください)
Noam Manos 2016年

1
@NoamManos:モジュール名を参照しています(クラス名は引き続きConfigParserです)。
ジョナスByström

2
それも一緒に動作することに注意してくださいConfigParser.ConfigParser()
Jean-Francois T.

確かに。できます。このパラメーターは、ConfigParser()クラスでもサポートされているため、基本的にRawConfigParser()に関連付けられていないことに注意してください。ありがとう。
ivanleoncz

7

コードに追加:

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

1
これは、少なくともpython 2.7では機能するようで、受け入れられている回答よりもはるかにクリーンです。ありがとうfoo!
hrbdg

2
これは最高得点の回答と同じです-行を参照してくださいconfig.optionxform=str:)lamdbaの代わりに@Martinv.Löwisは埋め込みstr関数を使用します
xuthus

@ xuthus-確かに、1行ではなく11行のコードを使用できます。好きなように。
FooBar167

4

私はこの質問が答えられることを知っています、しかし私は何人かの人々がこの解決策が役に立つと思うかもしれないと思いました。これは、既存のConfigParserクラスを簡単に置き換えることができるクラスです。

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

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

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

parser = CaseConfigParser()
parser.read(something)

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


以来optionxformのちょうど方法がありRawConfigParserますが、限り、あなた自身のサブクラスを作成するように行くつもりなら、あなたの代わりにだけではなく、インスタンスごとに、それを再定義するよりも、サブクラスでメソッドをオーバーライドする必要があります:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
OozeMeister

@OozeMeister素晴らしいアイデア!
icedtrees 2015年

2

警告:

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

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

次に、次の方法を使用して、パーサーで大文字と小文字を区別するようにします。

config.optionxform = str

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

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

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

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

これでFOO_BAZケースが維持され、InterpolationMissingOptionErrorは発生しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.