ConfigParser में मामला संरक्षित करें?


90

मैंने सेटिंग्स को बचाने के लिए पायथन के कॉन्फिगरेशन मॉड्यूल का उपयोग करने की कोशिश की है । मेरे एप्लिकेशन के लिए यह महत्वपूर्ण है कि मैं अपने अनुभागों में प्रत्येक नाम के मामले को संरक्षित करूं। डॉक्स का उल्लेख है कि पासिंग स्ट्रिप () से कॉन्फ़िगपेरस.ओपियनएक्सफ़ॉर्म () तक यह पूरा होगा, लेकिन यह मेरे लिए काम नहीं करता है। नाम सभी लोअरकेस हैं। क्या मैं कुछ भूल रहा हूँ?

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

पायथन छद्मकोड जो मुझे मिलता है:

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

जवाबों:


114

दस्तावेज भ्रामक है। वे क्या मतलब है:

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

यानी ऑप्शन को ओवरराइड करें, बजाय इसे कॉल करने के; ओवरराइडिंग एक उपवर्ग या उदाहरण में किया जा सकता है। ओवरराइड करते समय, इसे एक फ़ंक्शन (किसी फ़ंक्शन को कॉल करने के परिणाम के बजाय) पर सेट करें।

मैंने अब इसे बग के रूप में रिपोर्ट किया है , और यह तब से तय किया गया है।


धन्यवाद। यह काम करता है, और मैं मानता हूं कि डॉक्स भ्रमित कर रहे हैं।
पूजो

39

मेरे लिए ऑब्जेक्ट बनाने के तुरंत बाद ऑप्शनएक्सफॉर्म को सेट करने का काम किया

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

2
बहुत अच्छा काम करता है! (ध्यान दें कि अजगर 3 में यह "configparser" वर्ग का नाम है (कोई बड़ा नहीं)
Noam Manos

1
@NoamManos: आप मॉड्यूल नाम (वर्ग नाम अभी भी ConfigParser है ) की बात कर रहे हैं।
जोनास बिस्ट्रॉम

2
ध्यान दें कि इसके साथ भी काम करता हैConfigParser.ConfigParser()
जीन फ्रेंकोइस टी

वास्तव में। यह काम करता हैं। यह उल्लेख करने के लिए अच्छा है कि यह पैरामीटर अनिवार्य रूप से RawConfigParser () से जुड़ा हुआ नहीं है, क्योंकि यह समर्थन के साथ-साथ कॉन्फिगरेशन () वर्ग के साथ है। धन्यवाद दोस्त।
ivanleoncz

7

अपने कोड में जोड़ें:

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

1
यह मेरे लिए कम से कम अजगर 2.7 में काम करता है और स्वीकृत उत्तर की तुलना में बहुत अधिक साफ है। धन्यवाद फू!
hrbdg

2
यह टॉप स्कोर किए गए उत्तर के समान ही है - config.optionxform=strअपने lamdba @Martin v के बजाय लाइन :) देखें । Löwis एम्बेडेड strफ़ंक्शन का उपयोग करता है
xuthus

@xuthus - वास्तव में, आप 1 लाइन के बजाय 11 लाइनों के कोड का उपयोग कर सकते हैं। जैसा आपको पसंद।
FooBar167

4

मुझे पता है कि इस प्रश्न का उत्तर दिया गया है, लेकिन मुझे लगा कि कुछ लोगों को यह समाधान उपयोगी लग सकता है। यह एक ऐसा वर्ग है जो आसानी से मौजूदा विन्यासकर्ता वर्ग को बदल सकता है।

@ OozeMeister के सुझाव को शामिल करने के लिए संपादित:

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

उपयोग सामान्य configParser के समान है।

parser = CaseConfigParser()
parser.read(something)

ऐसा इसलिए है कि आप हर बार जब आप एक नया बनाते हैं ConfigParser, जो कि थकाऊ है।


चूँकि optionxformबस एक विधि है RawConfigParser, अगर आप अपना उपवर्ग बनाने के रूप में जहाँ तक जा रहे हैं, आपको इसके बजाय class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
उपविधि

@OozeMeister महान विचार!
आईसीटी

2

चेतावनी:

यदि आप विन्यासकर्ता के साथ डिफॉल्ट का उपयोग करते हैं, अर्थात:

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

और फिर इसका उपयोग करके पार्सर को संवेदनशील बनाने का प्रयास करें:

config.optionxform = str

कॉन्फिग फाइल (एस) से आपके सभी विकल्प अपना मामला रखेंगे, लेकिन FOO_BAZलोअरकेस में बदल दिया जाएगा।

चूक के लिए भी अपने मामले को रखने के लिए, @icedtrees उत्तर की तरह उपवर्ग का उपयोग करें:

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

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

अब FOO_BAZयह मामला है और आप InterpolationMissingOptionError नहीं रखेंगे ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.