2012-09-13 1 views
7

Python 2.7의 argparse에서는 명령 행 인수를 구문 분석하는 방법을 제어 할 수있는 두 개의 확장 점인 유형 함수와 조치 클래스를 제공합니다.argparse를 사용할 때 유효성 검사 및 초기화가 사용자 지정 형식이나 동작에서 발생해야합니까?

기본 제공되는 유형과 동작을 살펴보면 유효성 검사/초기화 코드가 포함 된 함수가 가장 적합한 것으로 보입니다. 동작은 값을 네임 스페이스에 저장하는 것과 관련이 있어야합니다. 이 접근법의 문제점은 부작용이있는 유형 확인 코드가있는 경우입니다. 이 간단한 예제를 고려하십시오 : 당신이 실행하는 경우

from argparse import ArgumentParser, FileType 
argp = ArgumentParser() 
argp.add_argument('-o', type=FileType('w'), default='myprog.out') 
argp.parse_args(['-o', 'debug.out']) 

, 당신은 파이썬 시스템, myprog.outdebug.out 파일을 열 것입니다 찾을 수 있습니다. 사용자가 -o 인수를 제공하지 않으면 debug.out 만 열리는 것이 더 합리적입니다.

조금씩 살펴보면 argparse는 전달 된 인수 또는 str 유형의 기본 인수에서만 type 함수를 호출하는 것으로 보입니다. 형식 검사기에 값이 전달 된 경우에도 기본값에서 호출되므로 부작용이있는 경우 불행합니다. 따라서 부작용이있는 초기화의 경우 작업에서 수행하는 것이 더 나을 것입니다. 이 문제는 기본값을 제공 할 때 작업이 호출되지 않는다는 것입니다.

이제
from argparse import ArgumentParser, Action 

def mytype(arg): 
    print 'checking type for ' + repr(arg) 
    return arg 

class OutputFileAction(Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     print 'running action for ' + repr(values) 
     try: 
      outstream = open(values, 'w') 
     except IOError as e: 
      raise ArgumentError('error opening file ' + values) 
     setattr(namespace, self.dest, outstream) 

argp = ArgumentParser() 
argp.add_argument('-o', type=mytype, action=OutputFileAction, default='myprog.out') 

것은 그것을 사용하려고 : 행동이 을 주문

>>> argp.parse_args([]) 
checking type for 'myprog.out' 
Namespace(o='myprog.out') 
>>> argp.parse_args(['-o', 'debug.out']) 
checking type for 'myprog.out' 
checking type for 'debug.out' 
running action for 'debug.out' 
Namespace(o=<open file 'debug.out', mode 'w' at 0x2b7fced07300>) 

다음 코드를 고려? 기본값이 사용자가 전달한 것과 똑같이 동작하도록하는 정상적인 방법이 있습니까? 또는 값을 제공 할 때 기본값을 typecheck하지 않습니까?

답변

2

알고있는 한,이 작업을 수행하는 "현명한"방법은 없습니다. 물론, Namespaceparse_args에서 반환 후 공정 오프 한 후 type 변환을 떠나 간단하다 :

args = argp.parse_args() 
args.o = open(args.o,'w') 

하지만 난 그게 당신이 찾고있는 것이 아니다 가정합니다.

+1

물론 가능합니다. 형식 유효성 검사기 또는 Action 클래스에서이 작업을 수행하려는 이유는 비슷한 인수를 사용하는 명령 줄 도구 모음을 작성한 것이므로 해당 인수를 구문 분석, 유효성 검사 및 인스턴스화하여 공통 코드로 만드는 코드를 분석하고 싶습니다. 함수/클래스 세트. 인수 처리 루틴이 인수 정의 내에 지정된 경우 코드가보다 명확합니다. – Nick

+0

너무 많은 노력없이 ArgumentParser를 하위 클래스로 분류하면이 문제를 관리 할 수 ​​있다고 생각합니다. – mgilson

+0

동작이 단순히 인수 검사기 (형식이 전달 된 문자열)에 대해서만 형식 검사기 및 동작을 호출하는 경우 얼마나 많은 프로그램이 중단되는지 궁금합니다. 다만, 디폴트가 basestring 형이 아닌 경우는, 형태 체크 스텝은 스킵됩니다. – Nick

관련 문제