다음 간단한 코드를 사용하여 일부 인수를 구문 분석합니다. 그중 하나가 필요합니다. 불행히도 사용자가 인수를 제공하지 않고 스크립트를 실행할 때 표시되는 사용법 / 도움말 텍스트에는 선택 사항이 아닌 인수가 있음을 나타내지 않으므로 매우 혼란스러워합니다. 파이썬이 인수가 선택적이 아님을 나타내도록 어떻게 할 수 있습니까?
코드는 다음과 같습니다.
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
필요한 인수를 제공하지 않고 위의 코드를 실행하면 다음과 같은 결과가 나타납니다.
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
답변
-
또는 --
로 시작하는 매개 변수 는 일반적으로 선택 사항으로 간주됩니다. 다른 모든 매개 변수는 위치 매개 변수이며 위치 함수 인수와 같은 설계 상 필요합니다. 선택적 인수가 필요할 수 있지만 이는 디자인과 약간 다릅니다. 그것들은 여전히 비 포지셔닝 인수의 일부이므로, 필요하더라도 혼란스러운 헤더“선택적 인수”아래에 계속 나열됩니다. 그러나 사용법 부분에서 빠진 대괄호는 실제로 필요하다는 것을 보여줍니다.
설명서 도 참조하십시오 .
일반적으로 argparse 모듈은 -f 및 –bar와 같은 플래그가 선택적 인수를 나타내며 명령 행에서 항상 생략 할 수 있다고 가정합니다.
참고 : 필수 옵션은 일반적으로 사용자가 옵션이 선택적 일 것으로 기대하므로 가능한 한 피해야합니다.
즉 , 도움말 의 헤더 “위치 인수” 및 “선택적 인수” 는 인수가 자동으로 분리되는 두 개의 인수 그룹에 의해 생성됩니다. 이제 “해킹”하고 선택 사항의 이름을 변경할 수 있지만 훨씬 더 우아한 해결책은 “필수 이름 지정된 인수”(또는 호출하려는 대상)에 대한 다른 그룹을 만드는 것입니다.
parser = argparse.ArgumentParser(description='Foo')
parser.add_argument('-o', '--output', help='Output file name', default='stdout')
requiredNamed = parser.add_argument_group('required named arguments')
requiredNamed.add_argument('-i', '--input', help='Input file name', required=True)
parser.parse_args(['-h'])
usage: [-h] [-o OUTPUT] -i INPUT
Foo
optional arguments:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
Output file name
required named arguments:
-i INPUT, --input INPUT
Input file name
답변
선택 사항 전에 필요한 인수를 나열하는 것을 선호하기 때문에 다음을 통해 해킹합니다.
parser = argparse.ArgumentParser()
parser._action_groups.pop()
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
return parser.parse_args()
그리고이 출력 :
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
--optional_arg OPTIONAL_ARG
선택적 인수 그룹에 ‘도움말’이 표시되지 않고 살 수 있습니다.
답변
@Karl Rosaen에서 시작
parser = argparse.ArgumentParser()
optional = parser._action_groups.pop() # Edited this line
required = parser.add_argument_group('required arguments')
# remove this line: optional = parser...
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
parser._action_groups.append(optional) # added this line
return parser.parse_args()
그리고이 출력 :
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
-h, --help show this help message and exit
--optional_arg OPTIONAL_ARG
답변
@RalphyZ를 기반으로 한 번 더
이것은 노출 된 API를 손상시키지 않습니다.
from argparse import ArgumentParser, SUPPRESS
# Disable default help
parser = ArgumentParser(add_help=False)
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')
# Add back help
optional.add_argument(
'-h',
'--help',
action='help',
default=SUPPRESS,
help='show this help message and exit'
)
required.add_argument('--required_arg', required=True)
optional.add_argument('--optional_arg')
위와 동일하게 표시되며 이후 버전에서도 살아남 아야합니다.
usage: main.py [-h] [--required_arg REQUIRED_ARG]
[--optional_arg OPTIONAL_ARG]
required arguments:
--required_arg REQUIRED_ARG
optional arguments:
-h, --help show this help message and exit
--optional_arg OPTIONAL_ARG