2011-03-03 14 views
23

मैंने अभी तर्क में एक व्यवहार देखा है जो मुझे परेशान करता है (अनुमान है कि मैंने पहले कभी फाइलों की गूंगा सूची के लिए इसका इस्तेमाल नहीं किया था):Argparse मुझे एक सूची में एक सूची क्यों देता है?

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('multi', action='append', nargs='+') 
print(parser.parse_args()) 

यह मुझे आउटपुट देता है:

~$ ./testargs.py foo bar baz 
Namespace(multi=[['foo', 'bar', 'baz']]) 
~$ 

मुझे उम्मीद थी multi['foo', 'bar', 'baz'] होने के लिए, सूची में एक सूची नहीं है। जैसा कि है, मुझे प्रसंस्करण से पहले args.multi[0] पकड़ना होगा, जो एक बड़ा सौदा नहीं है, लेकिन एक बदसूरत वार्ट की तरह लगता है, और मैं समझना चाहता हूं कि यह क्यों है।

क्या मैं add_argument में कुछ मूर्खतापूर्ण कर रहा हूं, या यह सिर्फ एक अपरिहार्य quirk है?

उत्तर

30

आप

parser.add_argument('multi', action='append', nargs='+') 

बुला रहे हैं और यह सब तर्क लेने और बहु ​​सूची में एक भी आइटम के रूप में जोड़कर कर रहा है।

आप अलग-अलग आइटम के रूप में यह चाहते हैं, बस संलग्न

parser.add_argument('multi', nargs='+') 

डॉक्स

'संलग्न' से उपयोग नहीं करते हैं - यह एक सूची संग्रहीत करता है, और सूची में प्रत्येक तर्क मान जोड़। यह एक विकल्प को कई बार निर्दिष्ट करने की अनुमति देने के लिए उपयोगी है। उदाहरण उपयोग:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--foo', action='append') 
>>> parser.parse_args('--foo 1 --foo 2'.split()) 
Namespace(foo=['1', '2']) 
+2

हू, आप सही हैं। मुझे दस्तावेज़ों से गलत इंप्रेशन मिला। शायद मुझे देखना चाहिए कि क्या मैं कुछ चीजों पर बेहतर शब्द के साथ एक पैच भेज सकता हूं। :) धन्यवाद! –

+1

हालांकि, ध्यान दें कि 'action =' append 'के बिना, विकल्प को कई बार निर्दिष्ट किया गया है, तो पिछले मानों को त्याग दिया जाएगा। जैसे 'argv = ['- foo', 'a', 'b', '--foo', 'c']' '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ foo ', nargs =' + ') '। –

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