언뜻보기에 'ls', 'del'등의 명령을 사용하여 서브 파서의 경우처럼 보입니다. 의 key
값이 프로그래머 정의 사전에서 오는 여부를
python program.py <key>
program.py <key value>
그것은 분명하지 않다 : 난 그냥 subparsers이 클래스
How to design object oriented subparsers for argparse?
에 정의되어 있습니다 예를 스케치 그러나 이러한 입력은 복잡 또는 사용자의 임의의 값입니다.
예제에서 볼 수 있듯이 프로그래머가 정의한 사전의 키를 서브 파서로 추가 할 수 있습니다.
그러나 임의의 '키 값'항목에는 다른 정의가 필요합니다. 많은 사람들이 key:value
또는 key=value
쌍을 입력하라는 질문을 많이 받았습니다. argparse
이 문제를 정상적으로 처리하지 못합니다. 프로그래머가 입력을 완전히 제어하려는 경우에 더 좋습니다.
아마도 간단한 argparse
접근 방식은
parser.add_argument('cmd') # simple required 1 term positional
parser.add_argument('value', nargs='?') # optional term
그리고 당신은 args.cmd
및 args.value
문자열의 자신의 시험을한다. 이는 sys.argv[1]
과 sys.argv[2:]
을 평가하는 데별로 도움이되지 않습니다.
은 값이 정의 된 문자열 세트로 제한되는 서브 파서 cmd
과 매우 유사하게 동작합니다.
optparse
은 플래그가 지정된 (-) 인수를 처리하고 모든 위치를 다시 목록으로 전달합니다. argparse
은 nargs
매개 변수와 일부 positionals
을 정의 할 수있는 기능을 제공하여이를 향상시키고 자 노력합니다.그러나 플래그가 지정된 많은 인수를 처리하는 것이 더 좋습니다. 위치 정보에 대한 콘텐츠 테스트는 제한적입니다.
요약하면 argparse
으로 이식하면 아무 것도 사지 못할 수도 있습니다. 당신은 표준이 아닌 표준에 맞서 노력하고 있습니다.
스크립트 argparse을 비교하고 여기이 목록의 첫 번째 제외한 모든 문자열을 걸었습니다
import sys
key = None
if sys.argv[1:]:
key = sys.argv[1]
value = sys.argv[2:]
print(key, value)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('key')
parser.add_argument('value', nargs='*')
args = parser.parse_args()
print(args)
를 분석 sys.argv에. '?'를 사용하십시오. 선택적으로 하나의 문자열을 허용합니다.
샘플 실행 :
1111:~/mypy$ python stack46631607.py
(None, [])
usage: stack46631607.py [-h] key [value [value ...]]
stack46631607.py: error: too few arguments
1111:~/mypy$ python stack46631607.py ls
('ls', [])
Namespace(key='ls', value=[])
1112:~/mypy$ python stack46631607.py del input
('del', ['input'])
Namespace(key='del', value=['input'])
1112:~/mypy$ python stack46631607.py key 1 2 3
('key', ['1', '2', '3'])
Namespace(key='key', value=['1', '2', '3'])
1112:~/mypy$ python stack46631607.py -h
('-h', [])
usage: stack46631607.py [-h] key [value [value ...]]
positional arguments:
key
value
optional arguments:
-h, --help show this help message and exit
argparse
는 오류 검사 (즉, 누락 된 첫 번째 문자열)을 추가하고, 도움이됩니다.
args.key
값을 어떻게 처리할지 결정하는 것은 귀하에게 달려 있으며, 이는 value
목록을 필요로하는지 여부를 결정합니다. 내가 말한대로 최선을 다해 ls
의 처리는 'arg'와 같고 'del'은 '입력'과 같습니다.
[* partial parsing *] (https://docs.python.org/3/library/argparse.html#partial-parsing)과 같은 소리가납니다. –
불행히도, 서브 파서가 부분 파싱을 방해하는 것처럼 보였으므로 대답을 삭제했습니다. 아마 대신 사용자 정의 작업이 필요합니다. –
@MartijnPieters right. ''ls'는 서브 파서가 의도 한대로 작동하지만'del'에 두번째 입력을 추가하는 데 문제가있었습니다. 다른 제안이 있으십니까? – Homer