2008-11-13 13 views
8

मैंने the docs का हिस्सा पढ़ा और देखा कि ConfigParser किसी अनुभाग के विकल्पों के लिए कुंजी/मान जोड़े की एक सूची देता है। मुझे लगा कि कुंजियों को एक खंड के भीतर अद्वितीय होने की आवश्यकता नहीं थी, अन्यथा पार्सर सिर्फ मैपिंग वापस कर देगा। मैं इस धारणा के आसपास मेरी कॉन्फ़िग फ़ाइल स्कीमा डिज़ाइन किया गया है, तो उदासी महसूस किया कि यह स्थिति नहीं है:पायथन की कॉन्फ़िगर पार्सर प्रति अनुभाग

>>> from ConfigParser import ConfigParser 
>>> from StringIO import StringIO 
>>> fh = StringIO(""" 
... [Some Section] 
... spam: eggs 
... spam: ham 
... """) 
>>> parser = ConfigParser() 
>>> parser.readfp(fh) 
>>> print parser.items('Some Section') 
[('spam', 'ham')] 

तो मैं वापस चला गया और डॉक्स का हिस्सा है कि मैं पढ़ा जाना चाहिए था पाया:

अनुभाग आमतौर पर बिल्टिन शब्दकोश में संग्रहीत किए जाते हैं। एक वैकल्पिक शब्दकोश का प्रकार कॉन्फ़िगरर्स नियंत्रक को पास किया जा सकता है। उदाहरण के लिए, यदि कोई शब्दकोश प्रकार बीत चुका है तो इसकी चाबियाँ टाइप करता है, तो अनुभाग लिखने पर क्रमबद्ध होंगे, जैसा कि प्रत्येक अनुभाग में कुंजी होगी।

मेरी मौजूदा कॉन्फ़िगरेशन फ़ाइल योजना (जिसे मैं वास्तव में अब पसंद करता हूं;) रखने के लिए, ऊपर बताए गए मैपिंग-जैसी ऑब्जेक्ट को पार करने के बारे में सोच रहा हूं जो उन्हें क्लॉबर करने के बजाय मूल्य जमा करता है। क्या कुंजी/मूल्य पतन को रोकने के लिए कोई आसान तरीका है जिसे मैं याद कर रहा हूं? एक पागल एडाप्टर बनाने के बजाय (ConfigParser के कार्यान्वयन में परिवर्तन तोड़ सकता है) क्या मुझे सिर्फ ConfigParser का एक प्रकार लिखना चाहिए?

मुझे लगता है कि यह उन 'duh' क्षणों में से एक हो सकता है जहां मैं केवल मुश्किल समाधान देख रहा हूं।

[संपादित करें:] यहाँ कैसे मैं एक ही कुंजी कई बार उपयोग करना चाहते हैं की एक और अधिक सटीक उदाहरण है:

[Ignored Paths] 
ignore-extension: .swp 
ignore-filename: tags 
ignore-directory: bin 

मैं अल्प विराम द्वारा सीमांकित सूची वाक्य रचना नापसंद है क्योंकि यह मुश्किल है पर आंखें जब आप इसे कई मूल्यों में स्केल करते हैं; उदाहरण के लिए, पचास एक्सटेंशन की कॉमा सीमांकित सूची विशेष रूप से पठनीय नहीं होगी।

+1

मुझे लगता है कि सूचियों का उपयोग करना 'अनदेखा-विस्तार: ...' –

+1

की 50 लाइनों की तुलना में अधिक पठनीय होगा? मैं असहमत हूं ... प्रत्येक के साथ एक अलग लाइन पर आप केवल सूची को स्कैन कर सकते हैं - मुझे कभी भी तीन-अक्षर एक्सटेंशन की अल्पविराम सीमित सूची नहीं मिली है। मैं उन लोगों को भी उम्मीद करता हूं जो किसी भी दिए गए विकल्प को आसानी से टिप्पणी करना चाहते हैं, जो अलग-अलग लाइनों के लिए अनुकूल है। – cdleary

उत्तर

11

कॉन्फ़िगरर्स ऐसी स्थितियों को संभालने के लिए डिज़ाइन नहीं किया गया है। इसके अलावा, आपकी कॉन्फ़िगरेशन फ़ाइल मुझे समझ में नहीं आता है।

ConfigParser आप प्रत्येक अनुभाग के लिए एक dict की तरह संरचना देता है, इसलिए जब आप parser.items (खंड) कहते हैं, मैं, dict.items() के समान उत्पादन जो सिर्फ कुंजी/मान tuples की एक सूची है उम्मीद कर रहा हूँ । मैं की तरह कुछ देखने की उम्मीद कभी नहीं होगा:

[('spam', 'eggs'), ('spam', 'ham')] 

का उल्लेख नहीं है, आप कैसे व्यवहार करने के लिए ?:

parser.get('Some Section', 'spam') 

कौन सा मान पुनर्प्राप्त करने का इरादा तरीका है निम्नलिखित उम्मीद करेंगे।

आप एक ही कुंजी के लिए अनेक मान संग्रहीत करना चाहते हैं, मैं अपने कॉन्फ़िग फ़ाइल में कुछ इस तरह का सुझाव देते हैं:

[Some Section] 
spam: eggs, ham 

और यह अपने कोड में:

spam_values = [v.strip() for v in parser.get('Some Section', 'spam').split(',')] 
बेशक

, यह केवल उन मानों के लिए काम करेगा जिनमें अल्पविराम शामिल नहीं है या उद्धरण संभाल नहीं है।इसके लिए, आपको एक और उन्नत तकनीक को नियोजित करना चाहिए (this और this देखें)।

संपादित करें: यदि आपको अतिरिक्त निर्भरता नहीं है, तो आप ConfigObj देख सकते हैं, जो मूल रूप से मान प्रकार के रूप में सूचियों का समर्थन करता है। इस दृष्टिकोण उपयोगी हो सकता है -

name: pyglet 
url: http://www.pyglet.org/ 

output: html 
target: doc/api/ 
...  
module: pyglet 

exclude: pyglet.gl.gl 
exclude: pyglet.gl.agl 
exclude: pyglet.gl.lib_agl 
exclude: pyglet.gl.wgl 
... 

आप वर्गों की जरूरत नहीं है:

+0

मैं उम्मीद करता हूं कि 'parser.get' कुंजी से जुड़े पहले या अंतिम मूल्य को वापस करने के लिए। मैं उम्मीद कर रहा था कि कॉन्फ़िगरेशन * आंतरिक रूप से * वस्तुओं के रूप में संग्रहीत किया गया था। मैं सूची वाक्यविन्यास को नापसंद करता हूं क्योंकि यह आंखों के लिए अधिक कठिन है, लेकिन मुझे स्विच करना पड़ सकता है। – cdleary

+0

मैं अनुमान लगा रहा हूं, लेकिन मुझे लगता है कि एक वर्ग एक वर्ग के लिए एक अधिक कुशल आधार वर्ग होगा। यदि ऐसा है, तो यह व्यवहार की व्याख्या करेगा। किसी भी तरह से, आप खुद को जो भी चाहते हैं उसे करने की कोशिश कर रहे सिरदर्द का एक नरक देने जा रहे हैं। –

+0

पर्याप्त मेला। मेरे पास पर्याप्त सिरदर्द है। :) – cdleary

0

ConfigParser की यह कमी कारण है कि pyglet इस्तेमाल किया patched version of epydoc इस simple format साथ आरं ConfigParser को बदलने के लिए है।

संबंधित मुद्दे