programing

Argparse:'--help'에 기본값을 포함하는 방법?

yoursource 2022. 10. 3. 22:51
반응형

Argparse:'--help'에 기본값을 포함하는 방법?

다음과 같은 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포맷?

포메터를 사용합니다.

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'표시되는 내용을 제어하기 위해 도움말 매개 변수를 선택합니다.

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

주의:

  • 그렇다.%+ 괄호 안의 기본값 + 형식 문자(컬리 괄호와 혼동하지 말 것){default}에서 찾을 수 있습니다.format또는 f-string)
  • 마지막으로 유형 표현에 "지정자 문자"를 추가하는 것을 잊지 마십시오(예:s스트링의 경우,d정수의 경우,f플로트 등)
  • 일반적인 "printf" 형식 지정자(플로트 숫자, 선행 0 등)를 추가할 수도 있습니다.

자세한 내용은 printf 문서를 참조하십시오.

래퍼 클래스

이것은 디폴트 표시와 다음과 같은 다른 포맷을 모두 사용할 수 있는 지금까지 발견된 방법 중 가장 신뢰성이 높고 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가 아닌 것 같습니다.또한 이 API의 메서드도formatter_class그래서 현재 공개 API 방법은 없는 것 같습니다. argparsedocstring :

이 모듈의 다른 모든 클래스는 구현 세부사항으로 간주됩니다.(또한 HelpFormatter 및 RawDescription에 주의해 주십시오.HelpFormatter는 오브젝트명으로만 퍼블릭으로 간주됩니다.포맷터 오브젝트의 API는 아직 구현 상세로 간주됩니다.

다음 항목도 참조하십시오.argparse 도움말 메시지 사용자 지정

Python 3.6.5에서 테스트 완료.

많은 경우, 다음과 같은 기능을 자동으로 포함시킬 수 있습니다.defaulthelp 출력의 값이지만 명시적으로 지정된 값만(를 사용하여)default=..이미 설명한 방법에는 이 점에서 몇 가지 단점이 있습니다.

  • ArgumentDefaultsHelpFormatter 메서드 출력(default: None)지정되지 않은 에 대해, 및 「」를 참조해 .(default: False)contraction ('contraction')의 경우action='store_true'이렇게 하면 도움말 출력이 복잡해집니다. , 「 」default=argparse.SUPPRESS이러한 인수마다 수동으로 추가해야 합니다.

  • '%(default)s' 메서드는 모든 인수의 '에 수동으로 추가해야 합니다.help인쇄하고 싶은 스트링입니다.

두 방법 모두 "올바른" 기본값만 인쇄하려면 수동 작업이 필요합니다.이것을 으로 하는 중 는 ''을 하는 입니다.ArgumentDefaultsHelpFormatterNone §False★★★★★★★★★★★★★★★★★★:

class ExplicitDefaultsHelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
    def _get_help_string(self, action):
        if action.default in (None, False):
            return action.help
        return super()._get_help_string(action)

ArgumentDefaultsHelpFormatter:

parser = argparse.ArgumentParser(
        formatter_class=ExplicitDefaultsHelpFormatter
                )

명시적으로 설정된 인쇄만 됩니다.default값을 지정합니다.

가 명시적으로 「」로되어 있는 경우: 「」는 「」로 설정되어 .None ★★★★★★★★★★★★★★★★★」False이. , 를 추가합니다.추가%(default)s으로 묶다help이 인수에 대해서는, 헬프 출력에 표시할 필요가 있습니다.

언급URL : https://stackoverflow.com/questions/12151306/argparse-way-to-include-default-values-in-help

반응형