2012-06-30 3 views
3

현재 파이썬의 argparse 모듈은 {1, 2, 3, ... 65535}가 아닌 '1 - 65535'만 출력하려고합니다. 그러나 문서가 어떤 방법을 제공하지 않는 것 같습니다 이. 어떤 제안?파이썬의 argparse 선택 제한 인쇄

답변

5

formatter_class option을 설정하여 기본값이 형식화되는 방식을 변경할 수 있습니다.

HelpFormatter class의 하위 클래스를 사용하여 choices 값의 형식을 변경하십시오. 이 클래스는 공식적으로 "구현 세부 사항"이지만 새로운 파이썬 버전으로 많이 바뀔지는 의문입니다.

_metavar_formatter method{1, 2, ..., 65535} 문자열을 포맷하고 하위 클래스는 그것을 무시할 수 :

class RangeChoiceHelpFormatter(HelpFormatter): 
    def _metavar_formatter(self, action, default_metavar): 
     if action.metavar is not None: 
      result = action.metavar 
     elif action.choices is not None: 
      result = '{%s .. %s}' % (min(action.choices), max(action.choices]) 
     else: 
      result = default_metavar 

      def format(tuple_size): 
       if isinstance(result, tuple): 
        return result 
       else: 
        return (result,) * tuple_size 
      return format 

또 다른 옵션은 하지 새로운 argument type을 정의하는 대신 같은 넓은 범위의 choices 인수를 사용하고 있습니다.

class IntRange(object): 
    def __init__(self, start, stop=None): 
     if stop is None: 
      start, stop = 0, start 
     self.start, self.stop = start, stop 

    def __call__(self, value): 
     value = int(value) 
     if value < self.start or value >= self.stop: 
      raise argparse.ArgumentTypeError('value outside of range') 
     return value 

당신은로 사용할 수 있습니다

이것은 단지 호출되어 문자열이 대상 유형으로 변환 할 수없는 경우 argparse.ArgumentTypeError, TypeError 또는 ValueError을 제기 문자열, 또는 달리 변환 된 값을 전달 인수 유형은 다음과 같습니다.

parser.add_argument('foo', type=IntRange(1, 65536)) 

및 허용되는 값을 나타내는 도움말 메시지를 조정하십시오.