2011-07-20 9 views
6

でのConfigParserと設定ファイルからリストを取得する:は、私は私の設定ファイル(文字列のリストが含まれている設定オプション)でこのような何かを持っているのPython

[filters] 
filtersToCheck = ['foo', '192.168.1.2', 'barbaz'] 

することは、よりエレガント(内蔵があります()を使用して、大括弧、一重引用符、空白を削除する代わりにfiltersToCheckからリストを取得し、split()を使用してリストを取得します。おそらく別のモジュールですか?おかげで..

(のpython3を使用して)

+0

可能な複製:http://stackoverflow.com/questions/335695/lists-in-configparser –

+0

私の意見では、それは同じではありません。私はそれを行うことができますが、私はよりエレガントな方法を探していますそれ以外にも、このリンクは3年ほど経っており、その後Pythonには言語として多くのことが起こっています。 – pootzko

+0

ConfigParserモジュールは、このユースケースを処理するために更新されていません。しかし、文字列中の '、'をチェックするためにそれをサブクラス化することができます。 – katrielalex

答えて

11

。しかし、あなたはSafeConfigParserクラスをサブクラス化し、削除[と]、カンマ区切りとして、あなたはそれが分割に

[filters] 
filtersToCheck = foo,192.168.1.2,barbaz 

を行うと、他のアプローチがofcourseのです

filtersToCheck = value.split(',') 

を行う得れば、それらをofcourseの持つことができ、リストを作成する。あなたはこれを醜いと呼んでいますが、これは実行可能な解決策です。

第3の方法は、設定ファイルとしてPythonモジュールを使用することです。プロジェクトがこれを行います。あなたのconfig.pyモジュールから利用可能な変数としてfiltersToCheckを持って、リストオブジェクトを使用してください。それはきれいな解決策です。いくつかの人々は、設定ファイルとしてpythonファイルを使用することに心配しています(これはセキュリティ上の危険を意味しますが、それは根拠のない恐怖です)が、設定ファイルとして機能するpythonファイルではなくconfigファイルを編集する必要があると考えているグループもあります。

+0

私の場合、セキュリティ上の懸念はありません。私が見る唯一の問題は、(cxfreezeを使って)スクリプトから実行ファイルを作る必要があるということです。Pythonモジュール(実行可能ファイルと同じフォルダにある)がその場合に動作するかどうかはわかりません。私はおそらくcxfreezeもコンパイルするので、それはないと思います。 – pootzko

+0

cxfreezeには無視オプションがありますか? –

+0

それを考えなかった!それは "--exclude-modules"を持っています。私はそれを試み、その結果を報告します。アイデアをありがとう。 – pootzko

2

configobjを見てください。あなたは、configファイルの値にリストのようなPythonオブジェクトを使用することはできません

1
ss = """a_string = 'something' 
filtersToCheck = ['foo', '192.168.1.2', 'barbaz'] 
    a_tuple =  (145,'kolo',45)""" 

import re 
regx = re.compile('^ *([^= ]+) *= *(.+)',re.MULTILINE) 


for mat in regx.finditer(ss): 
    x = eval(mat.group(2)) 
    print 'name :',mat.group(1) 
    print 'value:',x 
    print 'type :',type(x) 
    print 

結果

name : a_string 
value: something 
type : <type 'str'> 

name : filtersToCheck 
value: ['foo', '192.168.1.2', 'barbaz'] 
type : <type 'list'> 

name : a_tuple 
value: (145, 'kolo', 45) 
type : <type 'tuple'> 

その後

li = [ (mat.group(1),eval(mat.group(2))) for mat in regx.finditer(ss)] 
print li 

結果

[('a_string', 'something'), ('filtersToCheck', ['foo', '192.168.1.2', 'barbaz']), ('a_tuple', (145, 'kolo', 45))]