質問

ドキュメントの一部を読んだところ、 ConfigParser は、セクション内のオプションのキー/値ペアのリストを返します。キーはセクション内で一意である必要はありません。そうしないと、パーサーはマッピングを返すだけになります。この仮定に基づいて構成ファイルスキーマを設計しましたが、悲しいことに、そうではないことに気付きました。

>>> from ConfigParser import ConfigParser
>>> from StringIO import StringIO
>>> fh = StringIO("""
... [Some Section]
... spam: eggs
... spam: ham
... """)
>>> parser = ConfigParser()
>>> parser.readfp(fh)
>>> print parser.items('Some Section')
[('spam', 'ham')]

その後、戻ってドキュメントの一部を読んでおくべきを見つけました:

  

セクションは通常、   組み込み辞書。代替案   辞書タイプは   ConfigParserコンストラクター。例えば、   辞書型が渡された場合   キーを並べ替え、セクションは   書き戻しでソートされ、   各セクション内のキー。

既存の構成ファイルスキームを保持するために(これが本当に好きです;)上記のマッピングのようなオブジェクトを渡すことを考えています。欠落しているキー/値の崩壊を防ぐ簡単な方法はありますか?クレイジーなアダプター( ConfigParser の実装が変更されると壊れる可能性があります)を作成する代わりに、 ConfigParser 自体のバリアントを作成する必要がありますか?

これは、難しい解決策しか見られない「ダウ」の瞬間の1つかもしれないと感じています。

[編集:] 同じキーを複数回使用する方法のより正確な例を次に示します。

[Ignored Paths]
ignore-extension: .swp
ignore-filename: tags
ignore-directory: bin

コンマ区切りリスト構文は嫌いです。なぜなら、多くの値に拡大縮小する場合、目には難しいからです。たとえば、50個の拡張子のコンマ区切りリストは、特に読みやすいものではありません。

役に立ちましたか?

解決

ConfigParserは、このような状態を処理するようには設計されていません。さらに、あなたの設定ファイルは私には意味がありません。

ConfigParserは各セクションにdictのような構造を提供するため、parser.items(section)を呼び出すと、単なるキー/値のタプルのリストであるdict.items()に類似した出力が期待されます。私は次のようなものを見ることは決してないでしょう:

[('spam', 'eggs'), ('spam', 'ham')]

言うまでもなく、次の動作をどのように期待しますか?:

parser.get('Some Section', 'spam')

値を取得するための意図的な方法です。

同じキーに複数の値を保存したい場合、設定ファイルに次のようなものをお勧めします:

[Some Section]
spam: eggs, ham

そしてこれはあなたのコードで:

spam_values = [v.strip() for v in parser.get('Some Section', 'spam').split(',')]

もちろん、これはコンマ自体を含まないか、引用符を処理しない値に対してのみ機能します。そのためには、より高度な手法を使用する必要があります( this および this )。

編集:追加の依存関係を気にしない場合は、 ConfigObjをチェックアウトできます。 。これは、値タイプとしてリストをネイティブにサポートします。

他のヒント

のConfigParserのこの欠陥は、pygletを使用する理由<のhref = "http://code.google.com/p/pyglet/source/diff?spec=svnffc4fe58bc2179a75d3338aa821eb04649609871&old=95d2cfa3167ddd5ca7eb0cd25c277902370fd7f1&r=ffc4fe58bc2179a75d3338aa821eb04649609871&format=unidiff&path=%2Ftools%2Fepydocです%2Fepydoc%2Fcli.py "rel =" nofollow "> epydocのパッチを適用したバージョンでConfigParser iniをこのシンプルなフォーマット

name: pyglet
url: http://www.pyglet.org/

output: html
target: doc/api/
...    
module: pyglet

exclude: pyglet.gl.gl
exclude: pyglet.gl.agl
exclude: pyglet.gl.lib_agl
exclude: pyglet.gl.wgl
...

セクションが必要ない場合-このアプローチは便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top