Durum ConfigParser'da korunsun mu?


92

Ayarları kaydetmek için Python'un ConfigParser modülünü kullanmayı denedim . Uygulamam için bölümlerimdeki her ismin büyük / küçük harf durumunu korumam önemlidir. Dokümanlar, str () 'yi ConfigParser.optionxform ()' a iletmenin bunu başaracağını belirtiyor, ancak benim için çalışmıyor. İsimlerin hepsi küçük harflidir. Bir şey mi kaçırıyorum?

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

Aldığım şeyin Python sözde kodu:

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

Yanıtlar:


116

Belgeler kafa karıştırıcı. Demek istedikleri şudur:

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

Yani, optionxform'u çağırmak yerine geçersiz kılın; geçersiz kılma, bir alt sınıfta veya örnekte yapılabilir. Geçersiz kılarken, onu bir işleve ayarlayın (bir işlevi çağırmanın sonucu yerine).

Şimdi bunu bir hata olarak bildirdim ve o zamandan beri düzeltildi.


Teşekkür ederim. Çalışıyor ve belgelerin kafa karıştırıcı olduğuna katılıyorum.
pojo

39

Benim için, nesneyi oluşturduktan hemen sonra optionxform'u ayarlamak için çalıştı

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

2
Harika çalışıyor! (python 3'te "configparser" sınıf adı olduğuna dikkat edin (büyük harf yok)
Noam Manos

1
@NoamManos: Modül adına atıfta bulunuyorsunuz (sınıf adı hala ConfigParser'dır ).
Jonas Byström,

2
Bunun da işe yaradığını unutmayınConfigParser.ConfigParser()
Jean-Francois T.

Aslında. İşe yarıyor. ConfigParser () sınıfıyla da desteklendiğinden, bu parametrenin temelde RawConfigParser () ile ilişkili olmadığını belirtmek güzel. Teşekkürler dostum.
ivanleoncz

7

Kodunuza ekleyin:

config.optionxform = lambda option: option  # preserve case for letters

1
Bu benim için en azından python 2.7'de işe yarıyor gibi görünüyor ve kabul edilen cevaptan çok daha temiz. Teşekkürler foo!
hrbdg

2
Bu en yüksek puanlı cevap aynıdır - satır göreceksiniz config.optionxform=str:) sadece yerine v @Martin sizin lamdba Lowis gömülü kullanır. strfonksiyonunu
xuthus

@xuthus - Gerçekten, 1 satır yerine 11 satır kod kullanabilirsiniz. İstediğiniz gibi.
FooBar167

4

Bu sorunun yanıtlandığını biliyorum, ancak bazılarının 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.

@ OozeMeister'ın önerisini içerecek şekilde düzenlendi:

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

Kullanım normal ConfigParser ile aynıdır.

parser = CaseConfigParser()
parser.read(something)

Bu, her yeni oluşturduğunuzda optionxform'u ayarlamak zorunda kalmamanız içindir ConfigParserki bu biraz sıkıcıdır.


Yana optionxformsadece bir yöntemdir RawConfigParserkadarıyla kendi alt sınıf oluşturma gibi gideceksin eğer, bunun yerine sadece ziyade örnekleme başına onu yeniden tanımlanması daha alt sınıf üzerindeki yöntemi geçersiz olmalıdır:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
OozeMeister

@OozeMeister harika bir fikir!
buzlu ağaçlar

2

Uyarı:

ConfigParser ile varsayılanları kullanıyorsanız, yani:

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

ve sonra şunu kullanarak ayrıştırıcıyı büyük / küçük harfe duyarlı yapmaya çalışın:

config.optionxform = str

yapılandırma dosyalarındaki tüm seçenekleriniz durumunu koruyacaktır, ancak FOO_BAZ küçük harfe dönüştürülecektir.

Varsayılanların da durumunu korumak için, @icedtrees cevabındaki gibi alt sınıflandırma kullanın:

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

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

Şimdi durumu FOO_BAZkoruyacak ve InterpolationMissingOptionError'a sahip olmayacaksınız .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.