이 질문은 이미 많은 찬사를 받았으며 받아 들여진 대답이 많았지 만 지금까지 부울 문제를 표현하는 다양한 방법으로 혼란스러워하고 중요한 요점을 놓쳤습니다.
0 또는 3 개의 명령 행 인수를 수신 할 수있는 Python 스크립트가 있습니다. (기본 동작으로 실행되거나 지정된 세 값이 모두 필요함)
이 로직은 코드의 책임이 아니라argparse
모듈에의해 처리되어야합니다. 복잡한 if 문을 작성하지 말고 다음과 같이 인수 파서를 설정하십시오.
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
그리고 네, 그것은 선택적 인수이기 때문에 위치 인수가 아닌 옵션 이어야합니다 .
편집 : 주석에서 LarsH의 우려를 해결하기 위해 아래는 3 또는 0 위치 인수가있는 인터페이스를 원한다면 어떻게 작성할 수 있는지에 대한 예입니다. 선택적 인수는 options 이어야하기 때문에 이전 인터페이스가 더 나은 스타일이라고 생각합니다.그러나 여기에는 완전성을위한 대체 접근법이 있습니다. usage
파서를 생성 할 때우선 적용되는kwarg를 참고하십시오argparse
. 그렇지 않으면 오해의 소지가있는 사용 메시지가 자동 생성되므로
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
사용 예는 다음과 같습니다.
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments