2011-11-29 22 views
7

से बाहर चर निकालें मैं अजगर में argparse उपयोग कर रहा हूँ कमांडलाइन तर्क पार्स करने के लिए:पायथन: नाम स्थान

parser = ArgumentParser() 
parser.add_argument("--a") 
parser.add_argument("--b") 
parser.add_argument("--c") 
args = parser.parse_args() 

अब मैं a, b, और c साथ कुछ गणना करना चाहते हैं। हालांकि, मुझे हर समय args.a + args.b + args.c लिखना मुश्किल लगता है।

इसलिए, मैं उन चर निकालने हूँ:

a, b, c = [args.a, args.b, args.c] 

इस तरह की है कि मैं a + b + c लिख सकते हैं।

क्या ऐसा करने का एक और शानदार तरीका है?

कई तर्क जोड़ते समय मैन्युअल निष्कर्षण बहुत कठिन और त्रुटि प्रवण हो जाता है।

उत्तर

8

के एक मूल्य के साथ स्थानीय क्षेत्र में किया जा रहा है a में परिणाम होगा कि आप उन्हें वैश्विक रूप में चाहते हैं, आप कर सकते हैं:

globals().update(vars(args)) 

आप अगर ' एक समारोह में फिर से है और उन्हें लगता है कि समारोह के स्थानीय चर के रूप चाहते हैं, आप के रूप में इस अजगर 2.x में ऐसा कर सकते हैं:

def foo(args): 
    locals().update(vars(args))  
    print a, b, c 
    return 
    exec "" # forces Python to use a dict for all local vars 
      # does not need to ever be executed! but assigning 
      # to locals() won't work otherwise. 

यह चाल अजगर 3, जहां exec एक बयान नहीं है में काम नहीं करता, न ही अन्य पायथन वैरिएंट्स जैसे कि ज्योथन में या आयरनपीथन।

कुल मिलाकर, मैं केवल args ऑब्जेक्ट के लिए छोटे नाम का उपयोग करने की सलाह दूंगा, या अपने क्लिपबोर्ड का उपयोग करूंगा। :-)

+0

उत्तर के लिए धन्यवाद। यह काम करता है, लेकिन 'exec "" भाग बहुत बदसूरत हैक जैसा लगता है। यह जरूरी क्यों है? – Lemming

+0

सुधार: फ़ंक्शन में नेस्टेड फ़ंक्शंस होने पर यह काम नहीं करता है। इस मामले में निम्न त्रुटि संदेश पॉप अप करता है: 'exec" " सिंटेक्स त्रुटि: फ़ंक्शन 'मुख्य' में अयोग्य निष्पादन की अनुमति नहीं है, इसमें नि: शुल्क चर ' – Lemming

+0

आईके के साथ एक नेस्टेड फ़ंक्शन शामिल है। मुझे यह नहीं पता था, लेकिन यह समझ में आता है। क्लोजर के लिए पाइथन के मानक स्थानीय परिवर्तनीय तंत्र की आवश्यकता होती है, जो सूचकांक द्वारा स्थानीय लोगों तक पहुंचता है। एक समारोह बलों अजगर में कहीं भी 'exec' बयान के उपयोग के नाम से स्थानीय लोगों तक पहुँचने का एक वैकल्पिक तरीका, (उपयोग करने के लिए है क्योंकि' exec' परिभाषित या स्थानीय लोगों को संशोधित कर सकता है यह भी कारण है कि आप 'स्थानीय लोगों को अपडेट कर सकते()' यदि 'कार्यकारी 'समारोह में देखा जाता है, लेकिन अन्यथा नहीं)। – kindall

0

आप locals() पर कॉल करके स्थानीय दायरे में चीजें जोड़ सकते हैं। यह एक शब्दकोश देता है जो वर्तमान में उपलब्ध स्कोप का प्रतिनिधित्व करता है। साथ ही आप इसे करने के लिए मान निर्दिष्ट कर सकते हैं - locals()['a'] = 12 12.

+0

आपको 'स्थानीय()' के वापसी मूल्य को संशोधित नहीं करना चाहिए। यह प्रभाव होने की गारंटी नहीं है, और आमतौर पर सीपीथन में नहीं है। http://docs.python.org/library/functions.html#locals –

+0

लगता है कि इस के बिना 'कार्यकारी" "' चाल काम नहीं करता है, कि kindall उल्लेख किया है। – Lemming

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