11

それらがどこから来たのかを尋ねる質問があり、受け入れられた答えは、チュートリアルとソースコードへのリンクの束でした. argparse python modul 動作の説明: 大文字のプレースホルダーはどこから来るのですか?

どれも役に立ちませんでした。それらを取り除くか、目的を知りたいのです。

たとえば、次のような行です。

parser.add_argument('-c', '--chunksize', 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 文字列を試してみると、次のようになります。

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      chunk size in bits
4

3 に答える 3

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

動作するようです

于 2013-06-06T17:18:25.880 に答える
4

フォーマッタ クラスを作成して、必要な方法で引数をフォーマットできます。完全に単純ではありませんが、次の出力を生成するものを次に示します (コマンド名のセットに対して metavar を 1 回だけ表示したいという仮定で @mgilson が正しいと仮定します...それ以外の場合は、実際のを指定するだけmetavar='value'で表示されます正確にそのテキスト。):

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

クラスのコードと 2 つの出力の再現:

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 をまったく表示しないようにするには、空の文字列を 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
于 2013-06-06T18:29:09.753 に答える