คลาส Wrapper
นี่เป็นวิธีที่เชื่อถือได้และแห้งที่สุดที่ฉันเคยพบมาเพื่อแสดงค่าเริ่มต้นและใช้ตัวจัดรูปแบบอื่นเช่น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
การสืบทอดหลายรายการ
การสืบทอดหลายรายการใช้งานได้ แต่ดูเหมือนจะไม่ใช่ API สาธารณะ:
#!/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
docstring พูดว่า:
คลาสอื่น ๆ ทั้งหมดในโมดูลนี้จะพิจารณารายละเอียดการใช้งาน (โปรดทราบว่า HelpFormatter และ RawDescriptionHelpFormatter นั้นจะถือว่าเป็นชื่อสาธารณะเท่านั้น - API ของวัตถุของตัวจัดรูปแบบยังถือว่าเป็นรายละเอียดการใช้งาน)
ดูเพิ่มเติม: ปรับแต่งข้อความช่วยเหลือ argparse
ทดสอบกับ Python 3.6.5