तर्क: "वैकल्पिक तर्कों" के तहत सूचीबद्ध आवश्यक तर्क?


229

मैं कुछ तर्कों को पार्स करने के लिए निम्नलिखित सरल कोड का उपयोग करता हूं; ध्यान दें कि उनमें से एक की आवश्यकता है। दुर्भाग्य से, जब उपयोगकर्ता तर्क प्रदान किए बिना स्क्रिप्ट चलाता है, तो प्रदर्शित उपयोग / सहायता पाठ इंगित नहीं करता है कि एक गैर-वैकल्पिक तर्क है, जो मुझे बहुत भ्रमित करता है। मैं यह बताने के लिए कि एक तर्क वैकल्पिक नहीं है, मुझे अजगर कैसे मिल सकता है?

यहाँ कोड है:

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='Foo')
    parser.add_argument('-i','--input', help='Input file name', required=True)
    parser.add_argument('-o','--output', help='Output file name', default="stdout")
    args = parser.parse_args()
    print ("Input file: %s" % args.input )
    print ("Output file: %s" % args.output )

आवश्यक तर्क प्रदान किए बिना कोड से ऊपर चलने पर, मुझे निम्न आउटपुट मिलता है:

usage: foo.py [-h] -i INPUT [-o OUTPUT]

Foo

optional arguments:
    -h, --help            show this help message and exit
    -i INPUT, --input INPUT
                          Input file name
    -o OUTPUT, --output OUTPUT
                          Output file name

5
उपयोग लाइन में, -i INPUTभाग चौकोर कोष्ठक से घिरा नहीं है, जो सूक्ष्मता इंगित करता है कि वास्तव में आवश्यक है। इसके अलावा, आप मैन्युअल रूप से समझा सकते हैं कि helpपरम के माध्यम से
Jaime RGP

7
@JaimeRGP हाँ, लेकिन यह पर्याप्त नहीं है, ज़ाहिर है, और यह भी प्रमुख से कम है। optional argumentsआवश्यक तर्कों के लिए निर्धारित समूह का नाम अभी भी भ्रामक है।
एक्यूमेनस

जवाबों:


316

साथ शुरू होने वाले पैरामीटर -या --आमतौर पर वैकल्पिक माने जाते हैं। अन्य सभी पैरामीटर स्थितीय मानदंड हैं और जैसे डिजाइन के लिए आवश्यक हैं (जैसे कि स्थितीय कार्य तर्क)। वैकल्पिक तर्कों की आवश्यकता होती है, लेकिन यह उनके डिजाइन के खिलाफ थोड़ा सा है। चूँकि वे अभी भी गैर-स्थिति वाले तर्कों का हिस्सा हैं, इसलिए उन्हें आवश्यक होने पर भी भ्रमित हेडर "वैकल्पिक तर्कों" के तहत सूचीबद्ध किया जाएगा। उपयोग भाग में गायब चौकोर कोष्ठक हालांकि दिखाते हैं कि वे वास्तव में आवश्यक हैं।

दस्तावेज भी देखें :

सामान्य तौर पर, argparse मॉड्यूल मानता है कि -f और --bar जैसे झंडे वैकल्पिक तर्क इंगित करते हैं, जिन्हें हमेशा कमांड लाइन पर छोड़ा जा सकता है।

नोट: आवश्यक विकल्पों को आमतौर पर खराब रूप माना जाता है क्योंकि उपयोगकर्ता अपेक्षा करते हैं कि विकल्प वैकल्पिक हो, और इस प्रकार जब संभव हो तो उन्हें बचा जाना चाहिए।

यह कहा जा रहा है, हेडर्स "स्थिति संबंधी तर्क" और "वैकल्पिक तर्क" मदद में दो तर्क समूहों द्वारा उत्पन्न होते हैं जिसमें तर्क स्वचालित रूप से अलग हो जाते हैं। अब, आप "इसे हैक कर सकते हैं" और वैकल्पिक लोगों के नाम को बदल सकते हैं, लेकिन एक बहुत अधिक सुरुचिपूर्ण समाधान "आवश्यक नामित तर्क" (या जो भी आप उन्हें कॉल करना चाहते हैं) के लिए एक और समूह बनाना होगा:

parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('-o', '--output', help='Output file name', default='stdout')
requiredNamed = parser.add_argument_group('required named arguments')
requiredNamed.add_argument('-i', '--input', help='Input file name', required=True)
parser.parse_args(['-h'])
usage: [-h] [-o OUTPUT] -i INPUT

Foo

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        Output file name

required named arguments:
  -i INPUT, --input INPUT
                        Input file name

मैं एक ही मुद्दा रहा है। मैंने तुम्हें हल करने की कोशिश की। यह नए समूह में तर्क जोड़ देता है लेकिन मेरा कोड उसके बाद काम नहीं करता है। किसी भी समाधान की सराहना की जाएगी। मेरे कोड का लिंक - pastebin.com/PvC2aujz
जरार महमूद

1
@ZararMahmud: आप अपने कोड की लाइन 24 में खाली तर्कों से गुजर रहे हैं: parser.parse_args([])इसके बजाय, sys.argv parser.parse_args()की सामग्री को कैप्चर करने के लिए बिना किसी तर्क के उपयोग करें । प्रति argparse
डेविन

@ प्रहार: अच्छा समाधान! लेकिन इस मामले में मदद नहीं करता है कि आप आपसी अनन्य समूहों की जरूरत है, या मैं कुछ भी याद आ रही है?
जज


79

चूंकि मैं वैकल्पिक से पहले आवश्यक तर्कों को सूचीबद्ध करना पसंद करता हूं, इसलिए मैं इसके माध्यम से हैक करता हूं:

    parser = argparse.ArgumentParser()
    parser._action_groups.pop()
    required = parser.add_argument_group('required arguments')
    optional = parser.add_argument_group('optional arguments')
    required.add_argument('--required_arg', required=True)
    optional.add_argument('--optional_arg')
    return parser.parse_args()

और यह आउटपुट:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
               [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

optional arguments:
  --optional_arg OPTIONAL_ARG

मैं वैकल्पिक तर्कों के समूह में 'सहायता' के बिना रह सकता हूं।


3
क्या यह वास्तव में किसी भी तर्क को आवश्यकतानुसार मानने के लिए बाध्य करता है?
एंथनी

6
मुझे लगता है कि एक तर्क जोड़ते समय 'आवश्यक' तर्क को अभी भी सेट करने की आवश्यकता है।
कार्ल रोजेन

यह वाकई बहुत अच्छा है।
पॉल सेज़न

7
@Anthony - नहीं, आपको इसके लिए add_argument में 'आवश्यक = सत्य' की आवश्यकता है। उपर्युक्त उत्तर केवल तर्क समूह का चित्रण करता है।
user2275693

47

@ कार्ल रोजेन का निर्माण

parser = argparse.ArgumentParser()
optional = parser._action_groups.pop() # Edited this line
required = parser.add_argument_group('required arguments')
# remove this line: optional = parser...
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
parser._action_groups.append(optional) # added this line
return parser.parse_args()

और यह आउटपुट:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
           [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

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

1
BTW, वहाँ किसी भी तरीके (तरीके) _action_groupसंरक्षित सदस्य तक पहुँचने के बिना कैसे प्राप्त करने के लिए कर रहे हैं? मेरे मामले में मुझे पहले से मौजूद (कस्टम) समूह में कुछ तर्क जोड़ने की जरूरत है।
machin

यह भी खूब रही। --Help आइटम को दूसरी वैकल्पिक सूची में दिखाता है।
जेरेमी

नोट : यह उत्तर उजागर एपीआई को तोड़ता है , नीचे ब्रायन_ डी द्वारा उत्तर की जांच करें।
lol

18

एक बार और, @RalphyZ का निर्माण

यह एक उजागर एपीआई को नहीं तोड़ता है।

from argparse import ArgumentParser, SUPPRESS
# Disable default help
parser = ArgumentParser(add_help=False)
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')

# Add back help 
optional.add_argument(
    '-h',
    '--help',
    action='help',
    default=SUPPRESS,
    help='show this help message and exit'
)
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')

जो ऊपर के समान दिखाई देगा और भविष्य के संस्करणों को जीवित रखना चाहिए:

usage: main.py [-h] [--required_arg REQUIRED_ARG]
           [--optional_arg OPTIONAL_ARG]

required arguments:
  --required_arg REQUIRED_ARG

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

क्या आप बता सकते हैं कि राल्फिज़ का जवाब उजागर एपीआई को कैसे तोड़ता है?
jeremysprofile

5
_action_groupsकेवल आंतरिक उपयोग के लिए अभिप्रेत है। इसलिए, संस्करणों में कोई संगतता गारंटी नहीं है।
ब्रायन_डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.