Lớp bọc
Đây là cách tiếp cận DRY và đáng tin cậy nhất mà tôi đã tìm thấy cho đến nay để hiển thị mặc định và sử dụng một định dạng khác như argparse.RawTextHelpFormatter
cùng một lúc:
#!/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())
Đầu ra:
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
thừa kế nhiều
Nhiều kế thừa chỉ hoạt động, nhưng dường như không phải là API công khai:
#!/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()
Đầu ra:
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)
Nó chỉ hoạt động hiệu quả vì như chúng ta có thể thấy một cách tầm thường từ các nguồn https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648 rằng:
RawTextHelpFormatter
thực hiện _split_lines
ArgumentDefaultsHelpFormatter
thực hiện _get_help_string
vì vậy chúng tôi có thể đoán rằng họ sẽ làm việc tốt với nhau.
Tuy nhiên, đây dường như không phải là API công khai và cũng không phải là phương pháp formatter_class
, vì vậy tôi không nghĩ rằng hiện tại có một cách API công khai để thực hiện. argparse
docopes nói:
Tất cả các lớp khác trong mô-đun này được coi là chi tiết thực hiện. (Cũng lưu ý rằng HelpFormatter và RawDescripHelpFormatter chỉ được coi là công khai dưới dạng tên đối tượng - API của các đối tượng định dạng vẫn được coi là một chi tiết triển khai.)
Xem thêm: Tùy chỉnh thông báo trợ giúp argparse
Đã thử nghiệm trên Python 3.6.5.