다음과 같은 argparse 스 니펫이 있다고 가정하십시오.
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
포맷터를 서브 클래 싱해야 합니까?
답변
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)
답변
'%(default)s'
표시되는 것을 제어하기 위해 help 매개 변수에 추가하십시오 .
parser.add_argument("--type", default="toto", choices=["toto","titi"],
help = "type (default: %(default)s)")
답변
래퍼 클래스
이것은 지금까지 찾은 가장 신뢰할 수 있고 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
다중 상속
다중 상속은 작동하지만 공개 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는 여전히 구현 세부 사항으로 간주됩니다.
Python 3.6.5에서 테스트되었습니다.