2016-10-14 10 views
1

다음 코드에서 볼 수 있듯이 선택적 위치 지정 인수 files을 갖고 싶습니다. 경로가 전달되면 지정된 경로를 사용하여 기본값을 지정하고 싶습니다.argargse에서 nargs = '*'인수와 함께 선택적 위치 인수를 사용하는 방법은 무엇입니까?

그러나 --bar에 여러 인수가있을 수 있으므로 전달 된 경로가 args.files이 아니므로 해결할 수 있습니까? 감사!

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo') 
parser.add_argument('--bar', nargs='*') 
parser.add_argument('files', nargs='?') 

cmd = '--foo a --bar b c d ' 
print parser.parse_args(cmd.split()) 
# Namespace(bar=['b', 'c', 'd'], files=None, foo='a') 


cmd = '--foo a --bar b c d /path/to/file1' 
print parser.parse_args(cmd.split()) 
# Namespace(bar=['b', 'c', 'd', '/path/to/file1'], files=None, foo='a') 
+2

'argparse'는'/ path/to/file1'이'bar'가 아니라'files'로되어 있다는 것을 어떻게 알 수 있습니까? – mgilson

답변

1

귀하의 인수 스펙 (--bar 무한 인수를 할 수 있기 때문에, 거기가 종료 될 때 files는 선택 사항이며, 특히 때문에, 알 수있는 좋은 방법은 없습니다), 그래서 사용자 명확성을 요구 본질적으로 모호합니다. 특히, argparse은 "스위치 섹션의 끝입니다. 모든 후속 인수는 위치 지정 섹션"앞에 --을 넣어서 위치를 알 수 있습니다. 당신이 할 경우

또한, 사용자가 어디 그것의 위치 인수를 전달할 수 있습니다

Namespace(bar=['b', 'c', 'd'], files='/path/to/file1', foo='a') 

(Py3에서 테스트하지만,뿐만 아니라 Py2에 적용해야합니다) :

cmd = '--foo a --bar b c d -- /path/to/file1' 
print parser.parse_args(cmd.split()) 

당신은 가야 다음에 위치 인수를 두지 않으므로 모호하지 않습니다. 예 :

cmd = '/path/to/file1 --foo a --bar b c d' 

또는

cmd = '--foo a /path/to/file1 --bar b c d' 

마지막으로, 당신은 소개 모호성 주어진 스위치 nargs='*' 사용하지 않도록 할 수있다. 다음

parser.add_argument('--bar', action='append') 

는 한 번에 여러 값을 하나를 공급하는 --bar 여러 번 통과하는 대신 한 번 통과하는 대신, --barlist 모든 용도를 축적, 스위치 당 하나의 값으로 여러 번 접수를 정의

cmd = '--foo a --bar b --bar c --bar d /path/to/file1'