আরগপারস: '--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
আপনি ডকপ্টে আগ্রহী হতে পারেন । আমি আরগপার্সে আর কখনও দেখিনি।
পাওলো স্কার্ডাইন

14
@ পাওলোস্কার্ডাইন - ভাষায় তৈরি হওয়া আরগপার্সের জন্য একটি বড় সুবিধা a
jordanm

1
@ পাওলোকার্ডাইন: আমার বর্তমান প্রকল্পে একটি মানহীন লাইব্রেরি টানাই সত্যিই ব্যথা হবে, তবে আমি নিশ্চিত যে ডকপটের আউটপুটটির চেহারা পছন্দ করবে। ভকভগক!
জেএস।

@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
তারপরে একটি নতুন প্রশ্ন তৈরি করুন, যার মধ্যে একটি ন্যূনতম প্রজননযোগ্য উদাহরণ যা সমস্যাটি দেখায় including যেমনটি আমি বলেছি, পাইথন ২.7 নিয়ে এটি আমার পক্ষে কাজ করে।
মার্টিজন পিটারস

3
@ ডেভিড আমারও একই সমস্যা ছিল। helpযুক্তি যুক্ত করুন add_argumentএবং এটি কাজ করা উচিত।
পাবলো দাজ ওগনি

190

যোগ '%(default)s'সাহায্যের প্যারামিটার কি প্রদর্শন করা হয় নিয়ন্ত্রন করতে পারেন।

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

9
আমি এই বিকল্পটি পছন্দ করি কারণ আমি ইতিমধ্যে ফর্ম্যাট_ক্লাস = আরগপারস.রউস্টেস্টহেল্প ফর্ম্যাটরটি ব্যবহার করেছি এবং ওওপি দিয়ে প্রায় বিচ্ছিন্ন হওয়ার মতো মনে করি না।
mqsoh

23
আপনার ফর্ম্যাটিং স্ট্রিংয়ে ভেরিয়েবল 'টাইপ' অন্তর্ভুক্ত করতে ভুলবেন না - যেমন একটি স্ট্রিংয়ের জন্য '% (ডিফল্ট) s', বা একটি ডিজিটের জন্য '% (ডিফল্ট) ডি'।
strongMA

1
আমি এই সমাধানটি আরও ভাল পছন্দ করি এটি অনেক সহজ এবং আমার কোনও ডিফল্ট মান ছাড়াই সুস্পষ্ট যুক্তিগুলি পরিচালনা করতে হবে না।
void.pointer

@mqsoh একাধিক উত্তরাধিকার আসলে শুধু কাজ করেন, কিন্তু দুর্ভাগ্যবশত পাবলিক এপিআই নয়: stackoverflow.com/a/52025430/895245
সিরো Santilli郝海东冠状病六四事件法轮功

1
আমি এটি পছন্দ করি কারণ ফর্ম্যাটর ক্লাস পরিবর্তন করা সর্বত্র "(ডিফল্ট: কিছুই নয়)" এর সাহায্যের হাতছানি দিয়ে চলেছে a
6005

11

মোড়ক ক্লাস

এটিই সবচেয়ে নির্ভরযোগ্য এবং ডিআরওয়াই পদ্ধতি যা আমি এখনও পর্যন্ত উভয় ডিফল্ট দেখাতে এবং 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

সুতরাং আমরা অনুমান করতে পারি যে তারা একসাথে ঠিক কাজ করবে।

তবে এটি সর্বজনীন এপিআই বলে মনে হয় না এবং এর পদ্ধতিগুলিও formatter_classনয়, সুতরাং বর্তমানে এটি করার কোনও পাবলিক এপিআই উপায় আছে বলে আমি মনে করি না। argparseডকস্ট্রিং বলেছেন:

এই মডিউলের অন্যান্য সমস্ত শ্রেণী প্রয়োগের বিবরণ হিসাবে বিবেচিত হয়। (এছাড়াও নোট করুন যে হেল্পফর্ম্যাটরটার এবং রডেস্ক্রিপশন হেল্পফর্ম্যাটরটি কেবলমাত্র সামগ্রীর নাম হিসাবে সর্বজনীন হিসাবে বিবেচিত হয় - ফর্ম্যাটর অবজেক্টগুলির এপিআই এখনও একটি প্রয়োগের বিশদ হিসাবে বিবেচিত হয়))

আরও দেখুন: আরগপার্স সহায়তা বার্তাটি কাস্টমাইজ করুন

পাইথন 3.6.5 এ পরীক্ষা করা হয়েছে।


1
দুর্দান্ত! অবশেষে উভয় ফর্ম্যাটযুক্ত ডক্ট্রিং এবং ডিফল্ট আর্গুমেন্ট মুদ্রিত আছে। ধন্যবাদ
সিলভাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.