2009-10-23 16 views
54

मैंने सेटिंग्स को सहेजने के लिए पाइथन के ConfigParser मॉड्यूल का उपयोग करने का प्रयास किया है। मेरे ऐप के लिए यह महत्वपूर्ण है कि मैं अपने वर्गों में प्रत्येक नाम के मामले को सुरक्षित रखूं। दस्तावेज़ों का उल्लेख है कि गुजरने वाले str() से ConfigParser.optionxform() इसे पूरा करेंगे, लेकिन यह मेरे लिए काम नहीं करता है। नाम सभी लोअरकेस हैं। क्या मैं कुछ भूल रहा हूँ? मैं क्या मिल कीकॉन्फ़िगरर्स में केस सुरक्षित रखें?

<~/.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')] 

उत्तर

73

प्रलेखन भ्रामक है। उनका क्या मतलब है:

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

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

अब मैंने this as a bug की सूचना दी है, और इसे तब से तय कर दिया गया है।

+0

धन्यवाद। यह काम करता है, और मैं सहमत हूं कि दस्तावेज़ उलझन में हैं। – pojo

+4

+1 बग की रिपोर्ट करने के लिए +1 – Tshepang

2

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

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

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

प्रयोग सामान्य ConfigParser के समान है।

parser = CaseConfigParser() 
parser.read(something) 

यह तो आप हर बार जब आप एक नया ConfigParser बनाने के लिए, एक तरह से कठिन है जो optionxform स्थापित करने के लिए होने से बचने के है।

+0

चूंकि 'optionxform' केवल 'RawConfigParser' पर एक विधि है, यदि आप अपने स्वयं के सबक्लास बनाने के लिए जाने जा रहे हैं, तो आपको इसके बजाय उपनिवेश पर विधि को फिर से परिभाषित करना चाहिए यह प्रति तत्कालता: 'क्लास केसकॉन्फिगर्स (कॉन्फ़िगर पार्सर): डीफ़ विकल्प एक्सप्लोर (स्वयं, विकल्पस्ट्रेट): वापसी विकल्पस्ट्रेट – OozeMeister

+0

@OozeMeister महान विचार! – icedtrees

20

मेरे लिए वस्तु बनाने के तुरंत बाद optionxform स्थापित करने के लिए काम किया

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

महान काम करता है! (ध्यान दें कि पायथन 3 में यह "configparser" वर्ग का नाम है (कोई अपरकेस नहीं) –

+0

@NoamManos: आप मॉड्यूल नाम का जिक्र कर रहे हैं (कक्षा का नाम अभी भी [ConfigParser] है (https://docs.python.org/3/ लाइब्रेरी/configparser.html # configparser.ConfigParser)) –

+0

ध्यान दें कि यह 'ConfigParser.ConfigParser() 'के साथ भी काम करता है। –

0

चेतावनी:

आप ConfigParser साथ चूक, यानी उपयोग करते हैं:

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 नहीं होगा।