वैकल्पिक स्थिति संबंधी तर्क दें?


651

मेरे पास एक स्क्रिप्ट है जिसका उपयोग इस तरह किया जाना चाहिए: usage: installer.py dir [-h] [-v]

dir एक स्थितिगत तर्क है जिसे इस तरह परिभाषित किया गया है:

parser.add_argument('dir', default=os.getcwd())

मैं dirवैकल्पिक होना चाहता हूं : जब यह निर्दिष्ट नहीं होता है तो यह सिर्फ होना चाहिए cwd

दुर्भाग्य से जब मैं dirतर्क निर्दिष्ट नहीं करता , मुझे मिलता है Error: Too few arguments

जवाबों:


825

उपयोग करें nargs='?'(या nargs='*' यदि आपको एक से अधिक dir की आवश्यकता होगी)

parser.add_argument('dir', nargs='?', default=os.getcwd())

विस्तारित उदाहरण:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

14
क्या ?और *एक ही बात वे नियमित अभिव्यक्ति (यानी में मतलब मतलब ?0 या 1, और की आवश्यकता है *0 की आवश्यकता होती है या अधिक)? यदि हां, तो क्या यह भी +काम करता है ?
डोलन एंटेन्यूकी

37
@ डोलन: हां, +काम करता है, भी। विवरण के लिए docs.python.org/2/library/argparse.html#nargs देखें ।
विनय साजिप Vin ’

2
क्या वैकल्पिक तर्क में दिखाने के लिए कोई उपाय है? या ऐसा लगता है कि स्थिति संबंधी तर्कों में एक पूर्ववर्ती 'वैकल्पिक' योग्यता होनी चाहिए। क्या यह रजिस्टर करना संभव है (जहाँ तक मदद का सवाल है) यह इस तरह है?
स्कैगनेटी

6
@ ऊपर से, आप देख सकते हैं कि dir वैकल्पिक है (कि यह argparse आउटपुट में वर्ग कोष्ठक में प्रकट होता है, यह इंगित करता है)।
विनय साजिप 15/14

1
टीएक्स! पहुँच dir से options.dir, नहीं args.dir, जैसा कि मैं कोशिश कर रहा था!
ptim

69

@VinaySajip उत्तर के विस्तार के रूप में। अतिरिक्त nargsध्यान देने योग्य हैं

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

एन (एक पूर्णांक)। कमांड लाइन से एन तर्कों को एक सूची में इकट्ठा किया जाएगा

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'। मौजूद सभी कमांड-लाइन तर्क एक सूची में एकत्र किए जाते हैं। ध्यान दें कि आम तौर पर इसके साथ एक से अधिक स्थितीय तर्क रखने का कोई मतलब नहीं है nargs='*', लेकिन इसके साथ कई वैकल्पिक तर्क nargs='*'संभव हैं।

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

'+'। '*' की तरह ही, सभी कमांड-लाइन आर्ग्स सूची में एकत्रित हो जाते हैं। इसके अतिरिक्त, एक त्रुटि संदेश उत्पन्न होगा यदि कम से कम एक कमांड-लाइन तर्क मौजूद नहीं था।

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER। शेष सभी कमांड-लाइन तर्क एक सूची में एकत्र किए जाते हैं। यह आमतौर पर कमांड लाइन उपयोगिताओं के लिए उपयोगी है जो अन्य कमांड लाइन उपयोगिताओं के लिए भेजते हैं

यदि nargsकीवर्ड तर्क प्रदान नहीं किया जाता है, तो भस्म किए गए तर्कों की संख्या कार्रवाई द्वारा निर्धारित की जाती है। आम तौर पर इसका मतलब है कि एक एकल कमांड-लाइन तर्क का उपभोग किया जाएगा और एक एकल आइटम (सूची नहीं) का उत्पादन किया जाएगा।

संपादित करें (@Acumenus द्वारा टिप्पणी से कॉपी की गई) nargs='?' डॉक्स कहते हैं: '?'। यदि संभव हो और एक आइटम के रूप में उत्पादन किया जाता है तो एक तर्क कमांड लाइन से भस्म हो जाएगा। यदि कोई कमांड-लाइन तर्क मौजूद नहीं है, तो डिफ़ॉल्ट से मान का उत्पादन किया जाएगा।


3
हालांकि यह ध्यान दिया जाना चाहिए कि nargs='?'एक सूची का उत्पादन नहीं करता है।
एक्यूमेनस

@ABB उत्तर की अंतिम पंक्ति Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.आशा है कि यह मदद करता है ...
Matas Vaitkevicius

1
उद्धृत पंक्ति परिभाषित न करने के मामले को संदर्भित करती है nargs, लेकिन nargs='?'इसे परिभाषित कर रही है। डॉक्स कहते हैं: '?'। यदि संभव हो तो कमांड लाइन से एक तर्क का उपभोग किया जाएगा, और एक आइटम के रूप में उत्पादित किया जाएगा। यदि कोई कमांड-लाइन तर्क मौजूद नहीं है, तो डिफ़ॉल्ट से मान का उत्पादन किया जाएगा।
एक्यूमेनस

@ABB उत्तर को संपादित करें यदि आपको लगता है कि कुछ गायब है। धन्यवाद।
मतस वैतवेविसियस

क्या बीच का अंतर है nargs=argparse.REMAINDERऔर nargs='*', वे अपने प्रभाव में समान (अजगर 2.7.10 और अजगर 3.6.1 में परीक्षण) कर रहे हैं के रूप में मुझे लगता है,?

-5

parser.add_argumentएक स्विच भी आवश्यक है । आप उपयोग कर सकते हैं required=False। यहाँ पायथन 2.7 के साथ एक नमूना स्निपेट है:

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()

11
ओपी स्थितीय परिमों के बारे में पूछ रहा था, न कि '- डायर'। 'आवश्यक' पदधारियों के लिए एक अमान्य तर्क है। और 'झूठा' एक टाइपो था, उसका मतलब था 'गलत'। नौसिखिया के लिए +1, मैलापन के लिए -1।
सोलोपिलॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.