2011-07-20 19 views
6

yılında ConfigParser ile bir yapılandırma dosyasından bir listesini alma: benim yapılandırma dosyasında (dizeleri bir listesini içeren bir yapılandırma seçeneği) böyle bir şey var Python

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

daha şık vardır (almanın doğasında)) köşeli ayraçları, tek tırnakları, boşlukları kaldırmak ve sonra bunu yapmak için split() kullanmak yerine filtersToCheck listesinden bir liste almanın yolu nedir? Belki farklı bir modül? Teşekkür ..

(kullanarak python3)

+0

Olası kopya: http://stackoverflow.com/questions/335695/lists-in-configparser –

+0

Bence aynı değil .. Yapılabileceğini biliyorum ama daha zarif bir yol arıyorum Bunu yapmak için ... Ayrıca - bu bağlantı yaklaşık 3 yaşında ve Python'a o zamandan beri bir dil olarak çok şey oldu. – pootzko

+0

ConfigParser modülü, bu kullanım durumunun üstesinden gelmek üzere güncelleştirilmemiştir; Ama yine de, 'dize' ve 'eğer' varsa bunları 'split' kontrol etmek için alt sınıf yapabilirsiniz. – katrielalex

cevap

11

sonucu. Ama tabii virgülle ayrılmış değerler olarak onlara sahip ve bunu bir bölünmüş

[filters] 
filtersToCheck = foo,192.168.1.2,barbaz 

yapmak olsun ve

filtersToCheck = value.split(',') 

diğer yaklaşım yapmak kez SafeConfigParser sınıfını sınıflara ve kaldırma tabii olduğunu olabilir [ve] ve listenin oluşturulması. Bunu çirkin olarak adlandırdın, ama bu uygulanabilir bir çözüm.

Üçüncü yöntem Python modülünü bir yapılandırma dosyası olarak kullanmaktır. Projeler bunu yapar. Sadece filters.Check modülünüzde bulunan bir değişken olarak filtersCheck komutunu kullanın ve liste nesnesini kullanın. Bu temiz bir çözümdür. Bazı insanlar python dosyasını yapılandırma dosyası olarak kullanmaktan korkarlar (güvenlik tehlikesi olarak nitelendirilirler, bu da temelsiz bir korkudur), ancak kullanıcıların aynı zamanda yapılandırma dosyalarını düzenleme dosyası olarak değil de python dosyalarını düzenlemeleri gerektiğine inanan bu grup var.

+0

Benim durumumda güvenlik endişeleri yok. Gördüğüm tek sorun, betiğimde (cxfreeze kullanarak) bir yürütülebilir dosya yapmam gerektiğidir. Bu durumda bir python modülünün (yürütülebilir dosyayla aynı klasörde) çalışıp çalışmadığından emin değilim? Cxfreeze de bunu derleyeceği için muhtemelen sanırım .. – pootzko

+0

cxfreeze herhangi bir göz ardı etme seçeneğine sahip değil mi? –

+0

bunu düşünmedi! "--exclude-modules" var. Bunu deneyeceğim ve sonucu bildireceğim. fikir için teşekkürler. – pootzko

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 

sonuç

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

Sonra

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

Sen yapılandırma dosyası için değer listesi gibi piton nesneyi kullanamaz

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