2014-10-12 2 views
1

args가 지정되지 않은 경우 이름 공간 (my_attribute = [ 'A', 'B', 'C']) 또는 myscript을 반환해야하는 myscript A B C과 같은 cli를 실행하고 싶습니다. 즉 네임 스페이스 (my_attribute = [ 'A', 'B', 'C', 'D'])Argparse 위치 지정 인수 또는 기본값

이게 가능합니까?

  • nargs = '+'는 적어도 1 명령 행 인수를 필요로하거나
  • nargs = 오류 제기 '?'라는 그것은 작동해야처럼
  • nargs의 = '*'이 보인다 1 개 또는 0 인수 걸리지 만 add_argument에 지정된 기본 목록()

나는 순간에 아래가 발생하지 않습니다.

parser.add_argument(
    dest='my_attribute', 
    choices=('A', 'B', 'C', 'D'), 
    nargs='*', 
    default=['A', 'B', 'C', 'D'], 
) 

** 편집

예를 들어

이 작동하지만, 나는 내가 사용하고 싶지 않는 B. 전에 -attr을 지정해야 -attr

parser.add_argument(
    '-attr', 
    dest='my_attribute', 
    choices=['A','B', 'C', 'D'], 
    nargs='+', 
    default=['A','B', 'C', 'D'], 

답변

0

어떤 오류 메시지가 나타 납니까? 기본값을 사용하려고

error: argument my_attribute: invalid choice: ['A', 'B', 'C', 'D'] (choose from 'A', 'B', 'C', 'D')

, 그러나 당신의 선택에 대해 전체를 시험하고있다 : 나는 당신의 코드를하려고하면

내가 얻을. 기본값을 전혀 테스트하지 않거나 목록의 각 요소를 개별적으로 테스트해야합니다.

choices이 없으면 * 위치가 작동합니다.

첫 번째 대답에서 알 수 있듯이 * 위치는 특별한 처리가 필요합니다. A *은 선택적입니다.

kludge는 default='A'을 사용합니다. 선택 테스트를 통과합니다. 결과 네임 스페이스는 Namespace(my_attribute='A')이됩니다. 예상되는 목록은 아니지만 파싱 후에 테스트하고 바꾸기가 쉽습니다.

parser = argparse.ArgumentParser() 
parser.add_argument(
    dest='my_attribute', 
    choices=('A', 'B', 'C', 'D'), 
    nargs='*', 
    default='A', 
) 
args = parser.parse_args() 

if args.my_attribute=='A': 
    args.my_attribute=['A', 'B', 'C', 'D'] 
print args 

이 주제에 (몇 세) 버그 리포트가 :

http://bugs.python.org/issue9625 'argparse : 변수 nargs에 대한 기본값에 문제가 사용 선택'

이 제안 것을 패치는 목록 기본값의 각 항목에 대해 '선택 사항'테스트를 수행합니다. 그걸로 argparse 예를 잘 실행해야합니다. 그러나 argparse 패치의 백 로그가 상당하므로 언제든지이 픽스를 곧 볼 것으로 예상하지는 않습니다.

0

nargs=4 ? 예 :

parser.add_argument(
    dest='my_attribute', 
    choices=list(itertools.permutations(['A', 'B', 'C', 'D'])) 
    nargs=4, 
    default=['A', 'B', 'C', 'D'], 
) 

참고 다음과 같은 선택을해야 할 수도 있습니다으로 choces의 순열 : 필요한 경우

'A', 'B', 'C', 'D' 
'A', 'D', 'C', 'B' 
... 
'D', 'C', 'B', 'A' 

combinationspermutations를 교체합니다.

+0

항상 3 개의 args를 지정해야하지 않습니까? 나는 args를 지정하지 않을 때 기본값을 반환하면서 0에서 4까지의 args를 지정할 수 있기를 원합니다. – puffin

+0

4 개의 args에 대한 답변을 업데이트했습니다 :) –

+0

이'choices'를 사용하면 사용법이 다음과 같습니다.'usage : PROG [-h] {} {} {}'. – hpaulj

관련 문제