Argparse: '--help' में डिफ़ॉल्ट मान शामिल करने का तरीका?


307

मान लीजिए कि मेरे पास निम्नलिखित अल्पाहार स्निपेट है:

diags.cmdln_parser.add_argument( '--scan-time',
                     action  = 'store',
                     nargs   = '?',
                     type    = int,
                     default = 5,
                     help    = "Wait SCAN-TIME seconds between status checks.")

वर्तमान में, --helpरिटर्न:

usage: connection_check.py [-h]
                             [--version] [--scan-time [SCAN_TIME]]

          Test the reliability/uptime of a connection.



optional arguments:
-h, --help            show this help message and exit
--version             show program's version number and exit
--scan-time [SCAN_TIME]
                    Wait SCAN-TIME seconds between status checks.

मैं कुछ पसंद करूंगा:

--scan-time [SCAN_TIME]
                    Wait SCAN-TIME seconds between status checks.
                    (Default = 5)

मदद के फॉर्मेट कोड में झांकने से सीमित विकल्प सामने आए। क्या एक समान तरीके के argparseलिए डिफ़ॉल्ट मूल्य को प्रिंट करने के लिए एक चतुर तरीका है --scan-time, या क्या मुझे फॉर्मेटर को सिर्फ उपवर्ग में रखना चाहिए help?


5
आपको docopt में रुचि हो सकती है । मैंने कभी भी अर्गपर्स को फिर से नहीं देखा।
पॉलो स्कार्डिन

14
@PauloScardine - भाषा के लिए बनाया जा रहा है argparse के लिए एक प्रमुख लाभ है।
जोर्डन

1
@PauloScardine: मेरी वर्तमान परियोजना में एक गैर-मानक पुस्तकालय को खींचना वास्तव में एक दर्द होगा, लेकिन मुझे यकीन है कि डॉकटॉप के आउटपुट की तरह दिखना चाहिए। पारितोषिक के लिए धन्यवाद!
जेएस।

@JS। आप कहते हैं "मेरी वर्तमान परियोजना में एक गैर-मानक पुस्तकालय खींचना वास्तव में दर्द होगा" वास्तव में? पिपी में बहुत उपयोगी पुस्तकालय हैं। मेरे संदर्भ में एक गैर-मानक पुस्तकालय में खींचना आसान है। यह दुखद है, अगर यह आपके संदर्भ में कठिन है।
गुत्थी

3
@ गुगली: यह परियोजना एक वाणिज्यिक एम्बेडेड परियोजना के लिए थी। आप सही स्थापना आसान थे। कॉर्पोरेट कानूनी से अनुमोदन प्राप्त करना एक बुरा सपना था।
जेएस।

जवाबों:


446

argparse.ArgumentDefaultsHelpFormatterफ़ॉर्मेटर का उपयोग करें :

parser = argparse.ArgumentParser(
    # ... other options ...
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

प्रलेखन उद्धृत करने के लिए:

उपलब्ध अन्य फॉर्मेट क्लास, ArgumentDefaultsHelpFormatterप्रत्येक तर्क के डिफ़ॉल्ट मूल्य के बारे में जानकारी जोड़ देगा।

ध्यान दें कि यह केवल उन तर्कों पर लागू होता है जिनकी मदद पाठ परिभाषित है ; helpकिसी तर्क के लिए कोई मूल्य नहीं है, डिफ़ॉल्ट मान के बारे में जानकारी जोड़ने के लिए कोई मदद संदेश नहीं है

आपके स्कैन-टाइम विकल्प के लिए सटीक आउटपुट तब बन जाता है:

  --scan-time [SCAN_TIME]
                        Wait SCAN-TIME seconds between status checks.
                        (default: 5)

12
क्या मैं यह नियंत्रित कर सकता हूं कि केवल स्पष्ट रूप से दिए गए तर्क default=डिफ़ॉल्ट मान दर्शाते हैं? चूंकि मुझे 'डिफ़ॉल्ट: कोई नहीं' ग्रंथ पसंद नहीं है।
जियांगुंग

14
आप सेट कर सकते defaultकरने के लिए SUPPRESS: default=argparse.SUPPRESS। ध्यान दें कि उस स्थिति में नाम स्थान परिणाम में कोई विशेषता नहीं जोड़ी जाएगी यदि वह तर्क छोड़ दिया गया था, तो defaultदस्तावेज देखें ।
मार्टिजन पीटरर्स

4
ध्यान दें कि आपको इसे प्रत्येक उप-निर्माता के लिए भी निर्दिष्ट करने की आवश्यकता है।
कोमोडोवेव

1
फिर एक नया प्रश्न बनाएं, जिसमें न्यूनतम प्रजनन योग्य उदाहरण शामिल है जो समस्या को प्रदर्शित करता है। जैसा कि मैंने कहा, यह मेरे लिए पायथन 2.7 के साथ काम करता है।
मार्टिन पीटर्स

3
@ डेविड मुझे भी यही समस्या हो रही थी। में helpतर्क जोड़ें add_argumentऔर वह काम करना चाहिए।
पाब्लो डिआज ओगनी सेप

190

'%(default)s'प्रदर्शित करने के लिए मदद पैरामीटर में जोड़ें ।

parser.add_argument("--type", default="toto", choices=["toto","titi"],
                              help = "type (default: %(default)s)")

9
मुझे यह विकल्प पसंद है क्योंकि मैंने पहले से ही format_class = argparse.RawTestHelpFormatter का उपयोग किया है और OOP के साथ फ़ार्टिंग करने का मन नहीं था।
mqsoh

23
अपने स्वरूपण स्ट्रिंग में चर 'प्रकार' को शामिल करना न भूलें- जैसे कि स्ट्रिंग के लिए '% (डिफ़ॉल्ट) s', या अंक के लिए '% (डिफ़ॉल्ट) d'।
strongMA

1
मुझे यह समाधान बहुत अच्छा लगता है, यह बहुत सरल है, और मुझे स्पष्ट रूप से बिना किसी डिफ़ॉल्ट मान के तर्कों को संभालने की आवश्यकता नहीं है।
void.pointer

@mqsoh कई विरासत वास्तव में बस काम किया है, लेकिन दुर्भाग्य से सार्वजनिक नहीं है एपीआई: stackoverflow.com/a/52025430/895245
Ciro Santilli 郝海东 multiple multiple multiple 法轮功

1
मुझे यह पसंद है क्योंकि फॉर्मेटर क्लास बदलने से हर जगह "(डिफ़ॉल्ट: कोई नहीं)" का एक गुच्छा जुड़ जाता है जो मदद को अव्यवस्थित कर रहा है।
6005

11

आवरण वर्ग

यह सबसे अधिक विश्वसनीय और DRY दृष्टिकोण है जो मैंने अब तक दोनों डिफॉल्ट को दिखाने के लिए पाया है और एक argparse.RawTextHelpFormatterही समय में इस तरह के रूप में एक और फॉर्मैटर का उपयोग करता है:

#!/usr/bin/env python3

import argparse

class ArgumentParserWithDefaults(argparse.ArgumentParser):
    def add_argument(self, *args, help=None, default=None, **kwargs):
        if help is not None:
            kwargs['help'] = help
        if default is not None and args[0] != '-h':
            kwargs['default'] = default
            if help is not None:
                kwargs['help'] += ' Default: {}'.format(default)
        super().add_argument(*args, **kwargs)

parser = ArgumentParserWithDefaults(
    formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.add_argument('--no-default', help='''my help
for no-default''')
parser.add_argument('--no-help', default=101)

parser.print_help()
print()
print(parser.parse_args())

आउटपुट:

usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
               [--no-help NO_HELP]

optional arguments:
  -h, --help            show this help message and exit
  -a A                  my help
                        for a Default: 13
  -b B                  my help
                        for b Default: 42
  --no-default NO_DEFAULT
                        my help
                        for no-default
  --no-help NO_HELP

Namespace(a=13, b=42, no_default=None, no_help=101)

ArgumentDefaultsHelpFormatter+ RawTextHelpFormatterकई विरासत

एकाधिक वंशानुक्रम बस काम करता है, लेकिन यह सार्वजनिक एपीआई नहीं लगता है:

#!/usr/bin/env python3

import argparse

class RawTextArgumentDefaultsHelpFormatter(
        argparse.ArgumentDefaultsHelpFormatter,
        argparse.RawTextHelpFormatter
    ):
        pass

parser = argparse.ArgumentParser(
    formatter_class=RawTextArgumentDefaultsHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.print_help()

आउटपुट:

usage: a.py [-h] [-a A] [-b B]

optional arguments:
  -h, --help  show this help message and exit
  -a A        my help
              for a (default: 13)
  -b B        my help
              for b (default: 42)

यह सिर्फ इसलिए काम करता है क्योंकि जैसा कि हम https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648 स्रोतों से देख सकते हैं :

  • RawTextHelpFormatter औजार _split_lines
  • ArgumentDefaultsHelpFormatter औजार _get_help_string

इसलिए हम अनुमान लगा सकते हैं कि वे ठीक काम करेंगे।

हालाँकि, यह सार्वजनिक API नहीं लगता है, और न ही इसके तरीके हैं formatter_class, इसलिए मुझे नहीं लगता कि वर्तमान में इसे करने के लिए कोई सार्वजनिक API तरीका है। argparseडॉकस्ट्रिंग कहते हैं:

इस मॉड्यूल में अन्य सभी वर्गों को कार्यान्वयन विवरण माना जाता है। (यह भी ध्यान दें कि HelpFormatter और RawDescriptionHelpFormatter को केवल सार्वजनिक नामों के रूप में सार्वजनिक माना जाता है - फ़ॉर्मेटर ऑब्जेक्ट्स की API को अभी भी कार्यान्वयन विवरण माना जाता है।)

इसे भी देखें: मदद संदेश को अनुकूलित करें

पायथन 3.6.5 पर परीक्षण किया गया।


1
महान ! अंत में दोनों प्रारूपित डॉकस्ट्रिंग और डिफ़ॉल्ट तर्क मुद्रित हैं। धन्यवाद
सिल्वेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.