2013-06-06 1 views
4

그들이 어디에서 왔는지 묻는 질문이있었습니다. 대답은 자습서와 소스 코드에 대한 링크였습니다. Explanation for argparse python modul behaviour: Where do the capital placeholders come from?파이썬의 argparse 모듈에서 대문자 자리 표시자를 피하는 방법은 무엇입니까?

아무 것도 그에게 도움이되지 않았습니다. 나는 그 중 하나를 제거하거나 그 목적을 알고 싶습니다. 예를 들어

, 같은 라인 :

parser.add_argument('-c', '--chunksize', type=int, help='chunk size in bits') 

이 같은 쓰레기를 생산 : 내가 얻을

parser.add_argument('-c', '--chunksize', metavar='', type=int, help='chunk size in bits') 

:

optional arguments: 
    -h, --help   show this help message and exit 
    -c CHUNKSIZE, --chunksize CHUNKSIZE 
         chunk size in bits 

을 나는 빈 metavar 문자열을 시도하는 경우 쉼표 뒤의 공백 :

+0

나는'argparse.SUPPRESS' 트릭을 할 수도 있지만, 분명히하지 ... – mgilson

+0

가 원하는 출력은 무엇이라고 생각? '-c CHUNKSIZE, --chunkesize CHUNKSIZE' 대신'-c chunksize, --chunksize chunksize'를 사용합니까? 그러면'metavar = ('chunksize')가 그것을 할 것입니다. 그 논쟁에 대한 도움이 전혀 없습니까? 'help = argparse.SUPPRESS' –

+0

무엇이 가치있는 일인지 생각해 봅시다. 기본 동작이 더 좋다고 생각합니다. 어떤 옵션이 인수를 사용하는지 (그리고 몇 개가 더 많은지) 더 분명합니다. 물론, 나는이 프로그램을 쓰지 않을 것이므로, 여기에있는 나의 의견은 중요하지 않을 수도있다. (그리고 그것은 괜찮은 것이다.) 나는 그 문제에 대한 나의 감정을 표현하고있다. – mgilson

답변

5
parser.add_argument('-c', '--chunksize', metavar='\b', type=int, help='chunk size in bits') 

+0

깔끔한 해킹, 롤. 나는 그것이 이것이 올바른 방법이라고 믿을 수 없다. – bug

+0

당신이 직접 말했습니다. 그것의 해킹은 옳은 길일 수는 없습니다. Lol – Aravind

+2

이것은 옵션 설명의 들여 쓰기를 엉망으로 만들 것입니다. – user1948847

4

당신은 당신이 원하는 어느 방식으로 인수를 형식으로 포맷터 클래스를 만들 수 있습니다 작동하는 것 같다. 완전히 똑바로 진행할 수는 없지만 다음 출력을 생성하는 예제가 있습니다. (명령 이름 집합에 대해 metavar를 한 번만 표시하기를 원하는 경우 @mgilson이 올바른 것으로 가정합니다 ... 그렇지 않으면 실제 metavar='value'을 지정하면됩니다. 정확하게 그 텍스트를 표시).

# without metavar specified: 
-c, --chunksize CHUNKSIZE 
       chunk size in bits 
# with metavar specified: 
-c, --chunksize some_metavar 
       chunk size in bits 

그리고 클래스의 코드와 재생이 개 출력 :

import argparse 
# 2.7-3.2 
class SingleMetavarHelpFormatter(argparse.HelpFormatter): 
    def _format_action_invocation(self, action): 
     if not action.option_strings: 
      metavar, = self._metavar_formatter(action, action.dest)(1) 
      return metavar 

     else: 
      parts = [] 

      # if the Optional doesn't take a value, format is: 
      # -s, --long 
      if action.nargs == 0: 
       parts.extend(action.option_strings) 

      # if the Optional takes a value, format is: 
      # -s ARGS, --long ARGS 
      else: 
       default = action.dest.upper() 
       args_string = self._format_args(action, default) 

       ## THIS IS THE PART REPLACED 
       #~ for option_string in action.option_strings: 
        #~ parts.append('%s %s' % (option_string, args_string)) ### this is change 
       ## /SECTION REPLACED 

       ## NEW CODE: 
       parts.extend(action.option_strings) 
       parts[-1] += ' %s' % args_string 
       ## /NEW CODE 
      return ', '.join(parts) 


parser = argparse.ArgumentParser(
    prog='PROG', 
    formatter_class=SingleMetavarHelpFormatter 
    ) 

parser.add_argument('-c', '--chunksize', type=int, help='no metavar specified') 
parser.add_argument('-w', '--with_metavar', type=int, help='metavar specified', metavar='some_metavar') 

parser.print_help() 

편집 : 이 전혀 metavar을 표시하지하려면, 당신은 통과 할 수 있습니다 메타 바에 빈 문자열 :

parser.add_argument('-e', '--with_empty_metavar', type=int, help='empty metavar specified', metavar='') 

원래 클래스와 새로운 클래스 간의 차이점은 짧은 명령 구문 뒤에 여분의 공백 문자가 부족하다는 것입니다.

#usage: PROG [-h] [-c CHUNKSIZE] [-w some_metavar] [-e] 
# 
#optional arguments: 
# -h, --help   show this help message and exit 
# -c CHUNKSIZE, --chunksize CHUNKSIZE 
#      no metavar specified 
# -w some_metavar, --with_metavar some_metavar 
#      metavar specified 
# -e, --with_empty_metavar 
#      empty metavar specified 
+0

하지만 왜이 메타바를 시작하고 싶습니까? Linux 명령 행 응용 프로그램의 일반적인 도움말 메시지를 보면이 메타 행이 보이지 않습니다. – bug

+0

빈 문자열을 메타 바로 전달하면 그 문자열이 표시됩니다. 나는 그것을 편집에 포함시켰다. –

+0

고마워요. 그래서 제 자신의 포맷터를 써서이 작업을 할 수있었습니다. 나는 왜 이렇게 성가신 일을해야하며 왜 이것이 기본 행동이 아닌지 왜 이해하지 못합니다. – bug

관련 문제