17

ConfigParserを使用して、次のように構成ファイルからデータをロードしています。

test.conf:

[myfiles]
fileone: %(datadir)s/somefile.foo
filetwo: %(datadir)s/nudderfile.foo

load.py:

import ConfigParser

config = ConfigParser.ConfigParser({'datadir': '/tmp'})
config.read('test.conf')

print config.items('myfiles')
print config.get('myfiles', 'datadir')

出力:

$ python load.py 
[('datadir', '/tmp'), ('filetwo', '/tmp/nudderfile.foo'), ('fileone', '/tmp/somefile.foo')]
/tmp

('datadir', '/tmp')変数置換のデフォルトがの一部として表示されていることに驚いています。構成ファイルの値であるかのように戻りますitems().get()この動作は予想されますか?デフォルトのディクショナリ値を取得せずに単純に反復できるようにするための回避策は.items()ありますが、それでもマジック補間を使用しますか?

参照:http ://docs.python.org/library/configparser.html

ありがとう!

更新:これは予想される動作であることが指摘されています。デフォルトは、構成ファイル内の他の名前と値のペアとまったく同じです。同様に、構成ファイルの名前と値のペアも「魔法の補間」に使用できるため、次のように定義します。

foo: bar
zap: %(foo)snowl

取得します[... ('zap': 'barnowl')]

それはかなりきちんとしていますが、私が達成したいことを達成できるかどうかまだ疑問に思っています。デフォルトなしで、変数の補間を使用して、構成ファイルの名前と値のペアを繰り返し処理します。

{basedir: '/foo/bar'}私の特定のシナリオは次のとおりです。特定のファイルへの絶対パスはインストールによって異なるため、構成オブジェクトをのようなもので初期化したかったのです。次に、その構成オブジェクトをに渡して、他のさまざまなクラスにファイルを反復処理させる必要があります。構成を読み取るすべてのクラスが、特定のデフォルトで初期化されていること、および実際のファイルではないため、それらを無視する必要があることを認識している必要はありません。これは可能ですか?.item()と.get()からデフォルトを非表示にする方法はありますが、それでも補間はありますか?ありがとう!

4

4 に答える 4

10

一般的に、 configparser.Configparserクラスは非常に役立つことがわかりましたが、不足もしています。他の人も持っています

ただし、サブクラス化して拡張することはできます。

Python3でテストされた問題の解決策は次のとおりです。

class ConfigParser(configparser.ConfigParser):
    """Can get options() without defaults
    """
    def options(self, section, no_defaults=False, **kwargs):
        if no_defaults:
            try:
                return list(self._sections[section].keys())
            except KeyError:
                raise NoSectionError(section)
        else:
            return super().options(section, **kwargs)

これは、 のソース コードを部分的にコピーしているため、悪い例の 1 つですoptions()。configparser 基本クラスが、例外キャストを組み込むRawConfigParserオプションの内部ゲッターと、それを利用する a を提供すると、より良いでしょう。次に、サブクラス化で を再利用できます。_options(self, section)options()_options()

Python 2 の場合、唯一の変更点は へのsuper()呼び出しだと思いますsuper(ConfigParser,self)

その後、次を使用できます。

print config.options('myfiles', no_defaults=True)

また、そのリストを使用して反復します。

于 2012-09-26T10:51:55.510 に答える
4

デフォルトを除外することはできませんか?

例えば:

filtered_items = [x for x in config.items('myfiles') if x[0] not in config.defaults()]

于 2016-06-07T10:51:49.383 に答える
1

これを試して:

config = ConfigParser.ConfigParser({'blahblahblah': 'blah'})
config.read('test.conf')

blahblahblahキーは、.iniファイルのテンプレートであるためではなく、デフォルトとして指定したため、にも表示さitemsれます。これは、ConfigParserがデフォルトを処理する方法です。ファイル内でデフォルトが見つからない場合は、デフォルト値が割り当てられます。

したがって、ここでは概念が単純に混乱しているように見えます。

于 2010-02-03T04:03:14.617 に答える