2017-03-27 1 views
1

을 회피 :파이썬 I는 다음과 같이 작동하는 프로그램이 argparse nargs 오류

prog.py filename -r 

내게 주어진 기본 디폴트 값

prog.py filename -r 0 500 20 

내가 관리했습니다 0, 500 and 20

을 사용을 사용 이것을 사용하여 달성하십시오 :

class RdistAction(argparse.Action): 
    def __call__(self,parser,namespace,values,option_string=None): 
     if not values: 
      setattr(namespace,self.dest,[0, 1000, 50]) 
     else: 
      setattr(namespace,self.dest,values) 

parser = argparse.ArgumentParser() 
parser.add_argument("-r", "--rdist", action=RdistAction, nargs='*', type=int) 
args = parser.parse_args() 

그러나 원래 목표는 nargs를 3으로 설정하는 것이 었습니다. 위의 코드에서 nargs = 3을 사용하면 3 개의 인수가 필요하다는 오류 메시지가 나타납니다.

저는 주위를 둘러 보았습니다. 그리고 결과에서 을 추가하고 해당 기능에서 무언가를 수정해야한다고 내게 알려줍니다. nargs='*' 일 때 위 코드에서 얻은 결과와 동일한 결과를 얻을 수 있습니까? 대신 nargs=3을 사용합니까? 내가 nargs='3'을 위해 add_argument 라인을 변경하는 경우

+0

'-r'을 전혀 제공하지 않으면 어떻게 될까요? – hpaulj

+0

당신의 이전 질문 http://stackoverflow.com/q/42928410 – hpaulj

+0

@hpaulj 내 프로그램은 이런 식으로 작동하고 파일 이름을 입력 한 다음 실행할 기능의 플래그를 입력하십시오. 단지 -r 일 때 rdist 함수는 표준 값으로 실행됩니다. 값과 함께 -r을 입력하면 rdist 함수가 해당 값으로 실행됩니다. 나는 새로운 질문으로 이것을 올릴 수 있었지만, 나의 질문은 커스텀 액션과 nargs 에러에 관한 것이었다. – AltoBalto

답변

4

, 나는 당신에 대해 가지고있는 오류 얻을 생각 : 나는 (따옴표없이) nargs=3을 설정하면

Traceback (most recent call last): 
    File "python", line 12, in <module> 
ValueError: length of metavar tuple does not match nargs 

를, 그것은 나를 위해 작동 :

import argparse 

class RdistAction(argparse.Action): 
    def __call__(self,parser,namespace,values,option_string=None): 
     if not values: 
     setattr(namespace,self.dest,[0, 1000, 50]) 
     else: 
     setattr(namespace,self.dest,values) 

parser = argparse.ArgumentParser() 
parser.add_argument("-r", "--rdist", action=RdistAction, nargs=3, type=int) 
print parser.parse_args('-r 0 500 20'.split()) 

Namespace(rdist=[0, 500, 20]) 

은 t가 있습니다 니가 찾고있는 모자?

nargs가 특수 문자 ('?', '*', '+'등) 중 하나가 아닌 경우 문자열이 아닌 정수 여야합니다.

the documentation은 이것을 지적합니다.

+0

해답을 가져 주셔서 감사합니다.하지만 제 질문에 대한 답을 잘못 이해했다고 생각합니다. 명확성을 위해 위의 주석을 참조하십시오. – AltoBalto

0

이전 질문에서 지적한 것처럼 -r을 생략하면 default이 args 네임 스페이스에 포함됩니다. 특별한 일을 할 필요가 없습니다.

nargs='?'에는 세 번째 옵션 인 const이 있습니다.

사용자 지정 동작은 -r이 문자열없이 사용될 때 네임 스페이스에 사용자 지정 값을 할당한다는 점에서 이와 유사하게 동작합니다.

구문 분석과 같이 대략 간다 : 각 인수의 순서를

  • 에 입력, 처리 positionals 및 옵션을 통해
  • 루프를 네임 스페이스에

    • 할당 기본값 values 자사의 Action.__call__
    • 번호로 전화 전달 된 날짜는 nargs 매개 변수에 따라 다릅니다.

    사용자 정의 RdistActionnargs 속성을 통하지 않고 values의 수를 제어하지 않습니다. nargs=3은 정확히 3을 의미합니다. nargs='*'은 '나에게 줄 수있는만큼'(즉, 0 또는 끝 또는 다음 플래그로)을 의미합니다.

    optparse에서 액션은 나머지 모든 문자열을 제공하며 원하는만큼 많이 소비 할 수 있습니다. 그러나 argparse에서 할당은 더 높은 수준에서 수행되고 Action은 주어진 것을 사용합니다.

    나는 범위를 포함하여 regex을 포함하도록 nargs을 확장하는 Python 버그/문제를 탐구했습니다. [0,3]. 그러나이를 위해서는 파서의 핵심 부분을 변경해야합니다.

    아직 노출되지 않은 이유는 무엇입니까? -r 옵션을 선택해야합니다.

  • +0

    하지만, 기본적으로 -r을 빼고 싶지 않습니다. 이 사용자 지정 작업은 이제 nargs = '*'를 사용해야한다는 사실을 제외하고는 저를 위해 수행됩니다. nargs = 3으로 동일하게 달성 할 수 있었고 nargs 오류를 우회하는 것이 가능했다면 기본적으로 궁금했습니다. 왜 내가 맨손으로 -r 옵션이 필요한지에 대한 위의 설명을 참조하십시오. 기본적으로 내가 찾고 있어요 – AltoBalto

    +0

    : '값 <3 경우 : 설정 기본값이 ..... 다른 합니다 : 사용 values' 을 부여하지만 그쪽으로'__call__' 기능을 설정하면 문제가 해결되지 않습니다, 그 이유는 비슷한 일이'__init__'에서 이루어진다면 효과가있을 지 모르겠습니다. 그러나 여러분이 대답 할 때, argparse 모듈을 변경해야한다는 것을 의미합니까? – AltoBalto

    +0

    http://bugs.python.org/issue11354는 범위를 포함하도록'nargs '를 일반화하는 버그/쟁점입니다. 사소한 패치는 아닙니다. – hpaulj

    관련 문제