2012-07-03 10 views
7

मैं टेम्पलेट-शैली इंटरपोलेशन के साथ पाइथन में ConfigObj का उपयोग कर रहा हूं। ** के माध्यम से मेरी कॉन्फ़िगरेशन शब्दकोश को अनवरोधित करना इंटरपोलेशन नहीं लगता है। क्या यह एक सुविधा या बग है? कोई अच्छा कामकाज?क्यों ** kwargs python ConfigObj के साथ interpolate नहीं है?

$ cat my.conf 
foo = /test 
bar = $foo/directory 

>>> import configobj 
>>> config = configobj.ConfigObj('my.conf', interpolation='Template') 
>>> config['bar'] 
'/test/directory' 
>>> '{bar}'.format(**config) 
'$foo/directory' 

मैं दूसरी पंक्ति /test/directory होने की अपेक्षा करता हूं। ** kwargs के साथ interpolation काम क्यों नहीं करता है?

+0

'' ** कीवर्ड तर्क केवल खोल मैपिंग के लिए काम करता है। सबसे अधिक, 'ConfigObj' उदाहरण पूर्ण [मैपिंग] (http://docs.python.org/glossary.html#term-mapping) इंटरफ़ेस को उजागर नहीं कर रहे हैं। –

+0

configObj * dict * से * विरासत से प्राप्त होता है, इसलिए यह निश्चित रूप से पूर्ण मैपिंग इंटरफ़ेस प्रदान करता है (और वास्तव में ** अनपैक * काम किया है * इसे अभी गलत मान मिल गया है)। मुझे यकीन नहीं है कि "**" "मूल्यों को कैसे प्राप्त करता है, यह स्पष्ट रूप से इंटरपोलेशन को छोड़कर है। मुझे काम करने के लिए कुछ प्रयोग करना होगा। – fuzzyman

+0

क्या वहां कुछ अजीबता सीधे विरासत से विरासत में शामिल नहीं है? उदाहरण के लिए , http://stackoverflow.com/questions/3387691/python-how-to-perfectly-override-a-dict। मैं इस पर कोई विशेषज्ञ नहीं हूं, लेकिन शायद [MutableMapping] का उपयोग कर रहा हूं (http: //docs.python .org/लाइब्रेरी/संग्रह.html # संग्रह। मटेबल मैपिंग) या [डिक्टिक्क्सिन] (http://docs.python.org/library/userdict.html#UserDict.DictMixin) बेहतर होगा? –

उत्तर

2

कीवर्ड तर्क को अनपॅक करते समय, एक नई वस्तु बनाई जाती है: dict टाइप करें। इस शब्दकोश विन्यास के कच्चे-मूल्यों (कोई प्रक्षेप) शामिल हैं

प्रदर्शन:

>>> expandedConfig = {k: config[k] for k in config} 
>>> '{bar}'.format(**expandedConfig) 
'/test/directory' 
:

>>> id(config) 
31143152 
>>> def showKeywordArgs(**kwargs): 
...  print(kwargs, type(kwargs), id(kwargs)) 
... 
>>> showKeywordArgs(**config) 
({'foo': '/test', 'bar': '$foo/directory'}, <type 'dict'>, 35738944) 

आपकी समस्या को हल करने के लिए आप इस तरह आपके विन्यास की एक विस्तारित संस्करण बना सकते हैं

अनपॅकिंग से बचने के लिए एक और अधिक सुरुचिपूर्ण तरीका है: यह string.Formatter.vformat:

import string 
fmt = string.Formatter() 
fmt.vformat("{bar}", None, config) 
फ़ंक्शन का उपयोग करके हासिल किया जा सकता है
+0

चूंकि मेरा ConfigObj स्क्रिप्ट के दौरान नहीं बदलता है, यह ठीक होगा। हालांकि यह निश्चित रूप से गुंजाइश लगता है! –

2

मुझे एक ही समस्या है।

कॉन्फ़िगरेशन के फ़ंक्शन ".dict()" का उपयोग करने के लिए एक वर्कअराउंड है। यह काम करता है क्योंकि configobj एक असली शब्दकोश देता है, जो पाइथन जानता है कि कैसे अनपॅक करना है।

आपका उदाहरण बन जाता है:

>>> import configobj 
>>> config = configobj.ConfigObj('my.conf', interpolation='Template') 
>>> config['bar'] 
'/test/directory' 
>>> '{bar}'.format(**config.dict()) 
'/test/directory' 
संबंधित मुद्दे