14

構成ファイル (文字列のリストを含む構成オプション) に次のようなものがあります。

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

ブラケット、一重引用符、スペースを削除してからそれを行う代わりに、filtersToCheck からリストを取得するよりエレガントな (組み込みの) 方法はありますsplit()か? 多分別のモジュール?

(python3を使用。)

4

2 に答える 2

26

構成ファイルの値にリストのような python オブジェクトを使用することはできません。ただし、もちろん、それらをコンマ区切りの値として使用し、取得したら分割することができます

[filters]
filtersToCheck = foo,192.168.1.2,barbaz

そして、やります

filtersToCheck = value.split(',')

もう 1 つのアプローチはもちろん、SafeConfigParser クラスをサブクラス化し、[ と ] を削除してリストを作成することです。あなたはこれを醜いと言いましたが、これは実行可能な解決策です。

3 番目の方法は、Python モジュールを構成ファイルとして使用することです。プロジェクトはこれを行います。config.py モジュールから利用可能な変数としてfiltersToCheckを用意し、リストオブジェクトを使用してください。それはきれいな解決策です。一部の人々は、Python ファイルを設定ファイルとして使用することに懸念を抱いています (これをセキュリティ上の危険と呼んでいますが、これは根拠のない懸念です)。しかし、設定ファイルとして機能する Python ファイルではなく、設定ファイルを編集する必要があると考えるこのグループもいます。

于 2011-07-20T08:48:06.930 に答える
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))]
于 2011-07-20T08:42:43.820 に答える