web-dev-qa-db-ja.com

argparseヘルプメッセージをカスタマイズする

私の問題を示すために、次のサンプルコードを作成しました。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0')
parser.parse_args()

これにより、次のヘルプメッセージが生成されます。

$ python foo.py --help
usage: foo.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --version  show program's version number and exit

このヘルプ出力をカスタマイズして、すべてのフレーズと文を大文字にし、文の後にピリオドを付けるようにします。つまり、ヘルプメッセージをこのように生成する必要があります。

$ python foo.py --help
Usage: foo.py [-h] [-v]

Optional arguments:
  -h, --help     Show this help message and exit.
  -v, --version  Show program's version number and exit.

これはargparse APIを使用して制御できるものですか。もしそうなら、どのように?これを行う方法を示す小さな例を教えていただけますか?

24
Lone Learner

まず第一に、これらのフレーズを大文字にすることは慣習に反しており、argparseはこれらの文字列を簡単に変更するのに役立つツールではありません。ここには、3つの異なるクラスの文字列があります。ヘルプフォーマッタからの定型テキスト、セクションタイトル、および特定のオプションごとのヘルプテキストです。これらの文字列はすべてローカライズ可能です。 youcouldgettext() module support を介して、これらすべての文字列に対して「大文字」変換を提供するだけです。とはいえ、十分に決定されていて、 ソースコードを少し読む であれば、これらすべての文字列にアクセスして置換できます。

versionアクションにはデフォルトのhelpテキストが含まれていますが、help引数を設定して独自のテキストを指定できます。同じことがhelpアクションにも当てはまります。 add_help引数 to Falseには、そのアクションを手動で追加できます。

parser = argparse.ArgumentParser(add_help=False)

parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0', help="Show program's version number and exit.")
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
                    help='Show this help message and exit.')

次に、optional argumentsメッセージはgroup title;各パーサーには2つのデフォルトグループがあり、1つは位置引数用、もう1つはオプション用です。これらの属性には_positionalsおよび_optionals、両方ともtitle属性を持っています:

parser._positionals.title = 'Positional arguments'
parser._optionals.title = 'Optional arguments'

注意してください、アンダースコアで始まる名前にアクセスすることにより、モジュールのドキュメント化されていないプライベートAPIに飛び込み、将来のアップデートでコードが壊れる可能性があります。

最後に、usage文字列を変更するには、ヘルプフォーマッタをサブクラス化する必要があります。サブクラスを formatter_class引数

class CapitalisedHelpFormatter(argparse.HelpFormatter):
    def add_usage(self, usage, actions, groups, prefix=None):
        if prefix is None:
            prefix = 'Usage: '
        return super(CapitalisedHelpFormatter, self).add_usage(
            usage, actions, groups, prefix)

parser = argparse.ArgumentParser(formatter_class=CapitalisedHelpFormatter)

デモ、これらすべてをまとめて:

>>> import argparse
>>> class CapitalisedHelpFormatter(argparse.HelpFormatter):
...     def add_usage(self, usage, actions, groups, prefix=None):
...         if prefix is None:
...             prefix = 'Usage: '
...         return super(CapitalisedHelpFormatter, self).add_usage(
...             usage, actions, groups, prefix)
...
>>> parser = argparse.ArgumentParser(add_help=False, formatter_class=CapitalisedHelpFormatter)
>>> parser._positionals.title = 'Positional arguments'
>>> parser._optionals.title = 'Optional arguments'
>>> parser.add_argument('-v', '--version', action='version',
...                     version='%(prog)s 1.0', help="Show program's version number and exit.")
_VersionAction(option_strings=['-v', '--version'], dest='version', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help="Show program's version number and exit.", metavar=None)
>>> parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
...                     help='Show this help message and exit.')
_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='Show this help message and exit.', metavar=None)
>>> print(parser.format_help())
Usage: [-v] [-h]

Optional arguments:
  -v, --version  Show program's version number and exit.
  -h, --help     Show this help message and exit.
31
Martijn Pieters

Martijnは、思いついたいくつかの修正を提供しました-helpパラメーターの提供、およびカスタムFormatterクラス。

もう1つの部分的な修正方法は、引数の作成後にヘルプ文字列を変更することです。 add_argumentは、パラメーターとデフォルトを含むActionオブジェクトを作成して返します。これへのリンクを保存し、Actionを変更できます。また、それらのアクションのリストを取得して、それに基づいて行動することもできます。

デフォルトのヘルプともう1つの引数を持つ単純なパーサーのアクションリストは次のとおりです。

In [1064]: parser._actions
Out[1064]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)]

これらのいずれかのhelp属性を表示および変更できます。

In [1065]: parser._actions[0].help
Out[1065]: 'show this help message and exit'
In [1066]: parser._actions[0].help='Show this help message and exit.'

このヘルプの作成:

In [1067]: parser.parse_args(['-h'])
usage: ipython3 [-h] [-f FOO]    
optional arguments:
  -h, --help         Show this help message and exit.
  -f FOO, --foo FOO

parser._actions listは 'private'属性を使用しますが、これは賢明ではないと考える人もいます。しかし、Pythonパブリック/プライベートの区別は厳密ではなく、注意して壊すことができます。Martijnはparser._positionals.title

そのグループタイトルを変更する別の方法は、カスタム引数グループを使用することです

ogroup=parser.add_argument_group('Correct Optionals Title')
ogroup.add_argument('-v',...)
ogroup.add_argument('-h',...)
3
hpaulj