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.out
및 debug.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하지 않습니까?
물론 가능합니다. 형식 유효성 검사기 또는 Action 클래스에서이 작업을 수행하려는 이유는 비슷한 인수를 사용하는 명령 줄 도구 모음을 작성한 것이므로 해당 인수를 구문 분석, 유효성 검사 및 인스턴스화하여 공통 코드로 만드는 코드를 분석하고 싶습니다. 함수/클래스 세트. 인수 처리 루틴이 인수 정의 내에 지정된 경우 코드가보다 명확합니다. – Nick
너무 많은 노력없이 ArgumentParser를 하위 클래스로 분류하면이 문제를 관리 할 수 있다고 생각합니다. – mgilson
동작이 단순히 인수 검사기 (형식이 전달 된 문자열)에 대해서만 형식 검사기 및 동작을 호출하는 경우 얼마나 많은 프로그램이 중단되는지 궁금합니다. 다만, 디폴트가 basestring 형이 아닌 경우는, 형태 체크 스텝은 스킵됩니다. – Nick