이 문제는 http://bugs.python.org/issue9334에서 자세히 논의됩니다. 대부분의 활동은 2011 년이었습니다. 작년에 패치를 추가했으나 argparse
패치의 백 로그가 있습니다.
인수가있는 옵션 뒤에 오는 경우 '--env'
또는 "-s WHATEVER -e COOL STUFF"
과 같은 문자열에서 잠재적 인 모호성이 있습니다.
optparse
간단한 왼쪽에서 오른쪽 구문 분석을 수행합니다. 첫 번째 --env
은 하나의 인수를 취하는 옵션 플래그이므로, 어떻게 보이는지에 관계없이 다음을 소비합니다. 반면에 argparse
은 문자열을 두 번 반복합니다. 먼저 'O'또는 'A'(옵션 플래그 또는 인수)로 분류합니다. 두 번째 루프에서는 변수 nargs
값을 처리하기 위해 패턴 일치와 같은 re
을 사용하여 변수를 소비합니다. 이 경우에는 OO
, 두 개의 플래그 및 인수가없는 것 같습니다.
argparse
을 사용할 때의 해결책은 옵션 문자열에 대해 인수 문자열을 혼동하지 않게하는 것입니다. 여기에 (그리고 버그 문제에) 표시되었습니다 가능성은 다음과 같습니다 : 자체 '--env'
으로
--env="--env" # clearly defines the argument.
--env " --env" # other non - character
--env "--env " # space after
--env "--env one two" # but not '--env "-env one two"'
는 플래그 (인용하는 경우에도, sys.argv
참조)처럼 보이지만 다른 문자열 다음에 때하지 않습니다. 그러나 "-env one two"
은 ['-e','nv one two']
,`-e '플래그 다음에 문자열 (또는 더 많은 옵션)이 오는 것으로 해석 될 수 있기 때문에 문제가 있습니다.
--
및 nargs=argparse.PARSER
은 다음의 모든 문자열을 인수로 강제로 표시하는데도 사용할 수 있습니다 (argparse
). 그러나 인수 목록의 끝에서만 작동합니다.
args_default_to_positional=True
모드를 추가하기 위해 issue9334에 제안 된 패치가 있습니다. 이 모드에서 구문 분석기는 문자열을 정의 된 인수와 명확하게 일치시킬 수있는 경우에만 문자열을 옵션 플래그로 분류합니다. 따라서 '--env --one'의 '--one'은 인수로 분류됩니다. 그러나 '--env --env'의 두 번째 '--env'는 여전히 옵션 플래그로 분류됩니다.
Using argparse with argument values that begin with a dash ("-")
parser = argparse.ArgumentParser(prog="PROG")
parser.add_argument("-f", "--force", default=False, action="store_true")
parser.add_argument("-e", "--extra")
args = parser.parse_args()
print(args)
에 관련된 경우에 확장은 생성
-foo
가
-f
플래그로서 해석되기 때문에 "-foo 한"경우에 실패
1513:~/mypy$ python3 stack16174992.py --extra "--foo one"
Namespace(extra='--foo one', force=False)
1513:~/mypy$ python3 stack16174992.py --extra "-foo one"
usage: PROG [-h] [-f] [-e EXTRA]
PROG: error: argument -e/--extra: expected one argument
1513:~/mypy$ python3 stack16174992.py --extra "-bar one"
Namespace(extra='-bar one', force=False)
1514:~/mypy$ python3 stack16174992.py -fe one
Namespace(extra='one', force=True)
플러스 불특정 엑스트라들. 이는 -fe
이 ['-f','-e']
으로 해석되는 것과 동일한 동작입니다.
-e
그 플래그의 인수로 해석됩니다 후 나는 nargs
REMAINDER
에 (하지 PARSER
), 모든 것을 변경하는 경우 :
parser.add_argument("-e", "--extra", nargs=argparse.REMAINDER)
모든 경우에 작동합니다. 값은 목록입니다. 그리고 따옴표는 필요하지 않습니다 : 그것은 플래그처럼 여부를 찾을 지 여부를 다음과 모든 소요를 제외하고
1518:~/mypy$ python3 stack16174992.py --extra "--foo one"
Namespace(extra=['--foo one'], force=False)
1519:~/mypy$ python3 stack16174992.py --extra "-foo one"
Namespace(extra=['-foo one'], force=False)
1519:~/mypy$ python3 stack16174992.py --extra "-bar one"
Namespace(extra=['-bar one'], force=False)
1519:~/mypy$ python3 stack16174992.py -fe one
Namespace(extra=['one'], force=True)
1520:~/mypy$ python3 stack16174992.py --extra --foo one
Namespace(extra=['--foo', 'one'], force=False)
1521:~/mypy$ python3 stack16174992.py --extra -foo one
Namespace(extra=['-foo', 'one'], force=False)
argparse.REMAINDER
는 '*'와 같습니다. argparse.PARSER
은 '+'와 비슷합니다. positional
과 같은 인수가 먼저옵니다. subparsers
이 사용하는 nargs
입니다. 당신이
https://docs.python.org/3/library/argparse.html#nargs를 사용하는 파이썬의 버전은 무엇
이 설명되어 있습니다
REMAINDER
의 사용? – William파이썬 2.7을 사용하고 있습니다. – sfendell
파이썬 2.7에서 잘 돌아 간다. 다른 * 인수가 구성되어 있습니까? –