2013-08-08 5 views
2

argparse에서 도움말을 지정할 때, 나는 종종 인수에 %(default)s 또는 %(const)s과 같은 문자열을 사용하여 기본 인수를 표시합니다. 구문은 조금 이상합니다. 파이썬 문자열이 %으로 포맷 된 시점부터 남겨 졌다고 가정합니다. 그러나 파이썬 2.6 이후 문자열을 형식화하는 표준 방법은 format() 함수를 사용하고 있습니다.argparse 및 ConfigParser 문자열 대체 구문의 출처는 어디입니까?

이러한 라이브러리는 '오래된'대체 구문을 사용하고 있습니까? 아니면 다른 곳에서 온 것입니까? % 대체 연산자가 어느 시점에서 사라질 것이라고 언급되었지만이 라이브러리는 '{}'.format() 구문으로 변경됩니까?

답변

4

예, argparseConfigParser 라이브러리는 이전 스타일의 % 문자열 서식 구문을 내부적으로 사용합니다. 이 라이브러리는 str.format()format()이 사용되기 전에 개발되었거나 argparse의 경우 라이브러리 작성자는 이전 Python 버전과의 호환성을 목표로했습니다. % 형식 이제까지 이 제거되면

, 다음 해당 라이브러리는 참으로 {} 자리 표시자를 사용하여 서식 문자열을 사용하여 이동해야합니다.

그러나 여러 가지 이유로 이전 스타일 문자열 서식 스타일은 가까운 미래에 머물러 있습니다. 그것은 '비 사용되지 않음'입니다. str.format()이 선호되지만 하위 호환성을 위해 %이 유지됩니다.

+1

그것은 실제로 처음에 사용되지 적이있다. –

+1

이 구문은 파이썬 전에 어떤 전례가 있습니까? – Shep

+0

@SvenMarnach : 더 이상 사용되지 않는 오래된 문서의 복사본이 많지만 공식적으로 작성되지는 않았습니다. –

1

도움말 형식을 사용자 지정하는 승인 된 방법은 HelpFormatter의 하위 클래스를 만드는 것입니다. 사용자는 앞으로의 Python 릴리스를 기다리지 않고이 작업을 수행 할 수 있습니다.

이 포맷터는 {}. 서식을 2 곳에서 구현합니다. 예를 들어

class NewHelpFormatter(argparse.HelpFormatter): 
    # _format_usage - format usage, but only uses dict(prog=self._prog) 
    def _format_text(self, text): 
     # for description, epilog, version 
     if '{prog}' in text: 
      text = text.format(prog=self._prog) # change from % 
     text_width = self._width - self._current_indent 
     indent = ' ' * self._current_indent 
     return self._fill_text(text, text_width, indent) + '\n\n' 
    def _expand_help(self, action): 
     params = dict(vars(action), prog=self._prog) 
     for name in list(params): 
      if params[name] is argparse.SUPPRESS: 
       del params[name] 
     for name in list(params): 
      if hasattr(params[name], '__name__'): 
       params[name] = params[name].__name__ 
     if params.get('choices') is not None: 
      choices_str = ', '.join([str(c) for c in params['choices']]) 
      params['choices'] = choices_str 
     return self._get_help_string(action).format(**params) # change from % 

:

parser = argparse.ArgumentParser(prog='NewFormatter', 
    formatter_class=NewHelpFormatter, 
    description='{prog} description') 
parser.add_argument('foo',nargs=3, default=[1,2,3], 
    help='nargs:{nargs} prog:{prog!r} defaults:{default} last:{default[2]}') 
parser.add_argument('--bar',choices=['yes','no'], 
    help='choices: {choices!r}') 
parser.print_help() 

는 생산 :

usage: NewFormatter [-h] [--bar {yes,no}] foo foo foo 

NewFormatter description 

positional arguments: 
    foo    nargs:3 prog:'NewFormatter' defaults:[1, 2, 3] last:3 

optional arguments: 
    -h, --help  show this help message and exit 
    --bar {yes,no} choices: 'yes, no'