[PYTHON] 파이썬 argparse - 선택적 인수이거나 아니면 둘 다 아니다.
PYTHON파이썬 argparse - 선택적 인수이거나 아니면 둘 다 아니다.
기본 이름과 암호를 사용하는 프로그램이 있습니다. 나는 argparse를 사용하여 사용자가 명령 행 옵션을 지정할 수있게하고, 사용자가 프로그램에 다른 이름과 암호를 제공 할 수있게하고 싶다. 그래서 나는 다음과 같은 것을 가지고있다.
parser.add_argument(
'-n',
'--name',
help='the login name that you wish the program to use'
)
parser.add_argument(
'-p',
'--password',
help='the password to log in with.'
)
그러나 이름이나 암호 만 지정하는 것은 의미가 없지만 어느 것도 지정하지 않는 것이 좋습니다. 나는 argparse가 두 개의 인수가 상호 배타적이라는 것을 지정할 수있는 능력을 가지고 있다는 것을 알아 차렸다. 그러나 내가 가진 것은 함께 나타나야 만하는 두 가지 주장입니다. 어떻게 이런 행동을합니까? (문서에서 언급 한 "인수 그룹"을 발견했지만 내 문제를 해결하지 못하는 것 같습니다. http://docs.python.org/2/library/argparse.html#argument-groups)
해결법
-
==============================
1.이 문제를 해결하는 가장 좋은 방법은 반환 된 네임 스페이스를 사후 처리하는 것입니다. argparse가 이것을 지원하지 않는 이유는 인수 1을 한 번에 구문 분석하기 때문입니다. argparse가 이미 무언가가 파싱 되었는지를 확인하는 것이 쉽지만 (상호 배타적 인 논쟁이 작동하는 이유 인), 미래에 파싱 될지를보기는 쉽지 않습니다.
이 문제를 해결하는 가장 좋은 방법은 반환 된 네임 스페이스를 사후 처리하는 것입니다. argparse가 이것을 지원하지 않는 이유는 인수 1을 한 번에 구문 분석하기 때문입니다. argparse가 이미 무언가가 파싱 되었는지를 확인하는 것이 쉽지만 (상호 배타적 인 논쟁이 작동하는 이유 인), 미래에 파싱 될지를보기는 쉽지 않습니다.
간단한:
parser.add_argument('-n','--name',...,default=None) parser.add_argument('-p','--password',...,default=None) ns = parser.parse_args() if len([x for x in (ns.name,ns.password) if x is not None]) == 1: parser.error('--name and --password must be given together') name = ns.name if ns.name is not None else "default_name" password = ns.password if ns.password is not None else "default_password"
그것은 충분할 것 같습니다.
-
==============================
2.나는 이것이 2 년 이상 늦었다는 것을 알고있다. 그러나 나는 그것을 할 수있는 간결하고 멋진 방법을 발견했다.
나는 이것이 2 년 이상 늦었다는 것을 알고있다. 그러나 나는 그것을 할 수있는 간결하고 멋진 방법을 발견했다.
if bool(ns.username) ^ bool(ns.password): parser.error('--username and --password must be given together')
^는 파이썬에서 XOR 연산자입니다. 명령 줄에 주어진 두 인수를 모두 요구하려면 XOR 테스트가 필수적입니다.
-
==============================
3.아마 내가 어떻게 할 수 있겠는가. 변경할 옵션이있는 기존 기본값이 있으므로 기본값을 정의하지만 인수 기본값으로 사용하지 마십시오.
아마 내가 어떻게 할 수 있겠는가. 변경할 옵션이있는 기존 기본값이 있으므로 기본값을 정의하지만 인수 기본값으로 사용하지 마십시오.
default_name = "x" default_pass = "y" parser.add_argument( '-n', '--name', default=None, help='the login name that you wish the program to use' ) parser.add_argument( '-p', '--password', default=None, help='the password to log in with.' ) args = parser.parse_args() if all(i is not None for i in [args.name, args.password]): name = args.name passwd = args.password elif any(i is not None for i in [args.name, args.password]): parser.error("Both Name and Password are Required!") else: name = default_name passwd = default_pass
from https://stackoverflow.com/questions/14350343/python-argparse-either-both-optional-arguments-or-else-neither-one by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 for 루프의 [] 괄호는 무엇을 의미합니까? (0) | 2018.11.22 |
---|---|
[PYTHON] 1 억 개의 0을 가진 효율적인 파이썬 배열? (0) | 2018.11.22 |
[PYTHON] 파이썬 루프없이 단조로운 배열 만들기 (0) | 2018.11.21 |
[PYTHON] 빈 목록 부울 값 (0) | 2018.11.21 |
[PYTHON] 파이썬에서 현재 URL 얻기 (0) | 2018.11.21 |