Argparse : '--help'에 기본값을 포함시키는 방법은 무엇입니까?


307

다음과 같은 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포맷터를 서브 클래 싱해야 합니까?


5
docopt에 관심이있을 수 있습니다 . 나는 다시 argparse를 보지 않았다.
Paulo Scardine

14
@PauloScardine-언어에 내장 된 것은 argparse의 주요 이점입니다.
jordanm

1
@PauloScardine : 비표준 라이브러리를 현재 프로젝트에 가져 오는 것은 실제로 고통 스럽지만 docopt의 출력 모양을 좋아합니다. 팁 고마워!
JS.

@JS. "현재 프로젝트에 비표준 라이브러리를 가져 오면 정말 고통 스러울 것입니다." pypi에는 매우 유용한 라이브러리가 많이 있습니다. 내 맥락에서 비표준 라이브러리를 쉽게 가져올 수 있습니다. 상황이 어려우면 슬프다.
guettli

3
@guettli : 그 프로젝트는 상업용 임베디드 프로젝트를위한 것이 었습니다. 설치가 쉬웠습니다. 회사 법률로부터 승인을받는 것은 악몽이었습니다.
JS.

답변:


447

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=기본값을 표시하도록 제어 할 수 있습니까 ? 'default : None'텍스트가 마음에 들지 않기 때문에.
ziyuang 2018 년

14
당신은을 설정할 수 있습니다 default으로 SUPPRESS: default=argparse.SUPPRESS. 참고이 인수가 생략 된 경우이 경우에는 속성이 네임 스페이스 결과에 추가되지 않습니다 것을 볼 문서를 . default
Martijn Pieters

4
생성 된 각 하위 파서에 대해서도이를 지정해야합니다.
KomodoDave

1
그런 다음 문제를 보여주는 최소한의 재현 가능한 예 를 포함하여 새로운 질문을 만드십시오 . 내가 말했듯이, 그것은 파이썬 2.7에서 작동합니다.
Martijn Pieters

3
@David 나는 같은 문제를 겪고있었습니다. help인수를 추가하면 add_argument작동합니다.
Pablo Díaz Ogni

190

'%(default)s'표시되는 것을 제어하기 위해 help 매개 변수에 추가하십시오 .

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

9
format_class = argparse.RawTestHelpFormatter를 이미 사용하고 OOP로 방황하지 않기 때문에이 옵션이 마음에 듭니다.
mqsoh

23
서식 문자열에 변수 'type'을 포함하는 것을 잊지 마십시오 (예 : 문자열의 경우 '% (default) s', 숫자의 경우 '% (default) d').
strongMA

1
나는이 솔루션을 훨씬 더 좋아하고 훨씬 간단하며 기본값없이 인수를 명시 적으로 처리 할 필요가 없습니다.
void.pointer

@mqsoh 다중 상속은 실제로 단지 일했다,하지만 불행히도 공개 API는되지 않습니다 : stackoverflow.com/a/52025430/895245
치로 틸리郝海东冠状病六四事件法轮功

1
포맷터 클래스를 변경하면 "(default : None)"이 추가되어 도움말이 복잡해지기 때문에이 방법이 마음에 듭니다.
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다중 상속

다중 상속은 작동하지만 공개 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 방법이 없다고 생각합니다. argparsedocstring의 말 :

이 모듈의 다른 모든 클래스는 구현 세부 사항으로 간주됩니다. 또한 HelpFormatter 및 RawDescriptionHelpFormatter는 객체 이름으로 만 공용으로 간주됩니다. 포맷터 객체의 API는 여전히 구현 세부 사항으로 간주됩니다.

참조 : argparse 도움말 메시지 사용자 정의

Python 3.6.5에서 테스트되었습니다.


1
대단해! 마지막으로 서식이 지정된 docstring과 기본 인수가 모두 인쇄됩니다. 감사합니다
Sylvain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.