2009-10-23 17 views
54

Ayarları kaydetmek için Python'un ConfigParser modülünü kullanmayı denedim. Uygulamam için bölümlerimde her bir adın durumunu korumam önemlidir. Dokümanlar, str() öğesinin ConfigParser.optionxform()'a geçmesinin bunu gerçekleştireceğinden bahsetmektedir, ancak benim için çalışmaz. İsimlerin hepsi küçük harfli. Bir şey mi eksik? Ben ne olsunConfigParser'da durumu koru?

<~/.myrc contents> 
[rules] 
Monkey = foo 
Ferret = baz 

Python yalancı kod:

import ConfigParser,os 

def get_config(): 
    config = ConfigParser.ConfigParser() 
    config.optionxform(str()) 
    try: 
     config.read(os.path.expanduser('~/.myrc')) 
     return config 
    except Exception, e: 
     log.error(e) 

c = get_config() 
print c.options('rules') 
[('monkey', 'foo'), ('ferret', 'baz')] 

cevap

73

dokümantasyon kafa karıştırıcı. Demek istedikleri şu anlama gelir:

I.e. çağırmak yerine optionxform'u geçersiz kılmak; bir alt sınıfta veya örnekte geçersiz kılınabilir. Geçersiz kıldığınızda, bir işlevi (bir işlevi çağırmanın sonucu yerine) ayarlayın.

Şimdi this as a bug bildirdim ve o zamandan beri düzeltildi.

+0

Teşekkür ederim. Çalışıyor ve belgelerin kafa karıştırıcı olduğunu kabul ediyorum. – pojo

+4

+1 hata bildirimi için – Tshepang

2

Bu sorunun yanıtlandığını biliyorum, ancak bazı kişilerin bu çözümü yararlı bulabileceğini düşündüm. Bu, mevcut ConfigParser sınıfını kolayca değiştirebilen bir sınıftır.

Düzenlendi

@ OozeMeister önerisini dahil etmek:

class CaseConfigParser(ConfigParser): 
    def optionxform(self, optionstr): 
     return optionstr 

Kullanımı Normal ConfigParser aynıdır.

parser = CaseConfigParser() 
parser.read(something) 

Bu tür sıkıcı Yeni ConfigParser yapmak her zaman, optionxform ayarlamak zorunda kalmamak böyledir. Benim için

+0

'optionxform' 'RawConfigParser' üzerinde bir yöntem olduğundan, kendi alt sınıfınızı oluşturmaya kadar gidecekseniz, bunun yerine alt sınıftaki yöntemi yeniden tanımlamak yerine yöntemi geçersiz kılmalısınız. örnekleme başına: 'class CaseConfigParser (ConfigParser): def optionxform (self, optionstr): return optionstr' – OozeMeister

+0

@OozeMeister harika bir fikir! – icedtrees

20

nesnesi oluşturarak hemen sonra optionxform ayarlamak için çalıştı

config = ConfigParser.RawConfigParser() 
config.optionxform = str 
+1

Harika çalışıyor! (python 3'te "configparser" sınıfının (büyük harf yok) olduğunu unutmayın. –

+0

@NoamManos: Modül adına atıfta bulunuyorsunuz (sınıf adı hala [ConfigParser] (https://docs.python.org/3/ kütüphane/configparser.html # configparser.ConfigParser) –

+0

Not: ConfigParser.ConfigParser() ile de çalışır. –

0

Uyarı:

Eğer ConfigParser ile varsayılan, yani kullanıyorsanız:

config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'}) 

ve sonra yapmaya ayrıştırıcı büyük/küçük harfe duyarlı bir şekilde bunu kullanarak:

config.optionxform = str 

Tüm yapılandırma seçeneklerinden dosyalarınızı saklayın, ancak FOO_BAZ küçük harfe dönüştürülecektir.

varsayılan ayrıca @icedtrees gibi subclassing, kendi halinde tutmak kullanması için cevap:
class CaseConfigParser(ConfigParser.SafeConfigParser): 
    def optionxform(self, optionstr): 
     return optionstr 

config = CaseConfigParser({'FOO_BAZ': 'bar'}) 

Şimdi FOO_BAZ onu tutacak durumda ve sen InterpolationMissingOptionError olmayacaktır.

İlgili konular