1

さまざまなサブパーサーを備えた Python モジュールの引数パーサーを作成しています。私の目的は、Argument コンストラクターが複数の子に渡される共有される引数を持つことです。

from argparse import ArgumentParser
parser = ArgumentParser(prog = 'master')
parser1 = ArgumentParser(help = None)
parser1.add_argument('foo', type = int, help = 'Number of times to process %(prog)s') # Line of interest
parser2 = ArgumentParser(help = None)
parser2.add_argument('--bar', type = int, default = 0, help = 'Start at this number')
parser3 = ArgumentParser(help = None)
parser3.add_argument('--baz', type = str, default = 'DEFAULT', help = 'Init file with this text')
subparsers = parser.add_subparsers()
sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2])
sp2 = subparsers.add_parser('prog2', parents = [parser1, parser3])
parser.parse_args('prog1 -h'.split())

望ましい出力は次のようになります

usage: master prog1 [-h] [--bar BAR] foo

positional arguments:
  foo            Number of times to process prog1

optional arguments:
  -h, --help     show this message and exit
  --bar          Start at this number

この正確な設定を使用すると、ヘルプ文字列のmaster prog1代わりに. 目的の結果を得るには、マークされた行で何を変更する必要がありますか?prog1foo#Line of interest

4

2 に答える 2

0

何が起こっているのか説明できますが、解決策を提供できない場合があります。

簡単に言えば、はその形式とヘルプ ラインの値のsp1.prog両方で使用されます。そして、それを念頭に置いて構築されています。usage%(prog)susage


sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2])

パーサーを作成し、 から引数を追加しますparents。 (サブパーサー Action クラス) のadd_parserメソッドです。class _SubParsersActionそして、progそのパーサーの属性は次のように作成されます:

     if kwargs.get('prog') is None:
        kwargs['prog'] = '%s %s' % (self._prog_prefix, name)

print(sp1.prog)この属性は('master prog1' と予想します)で確認できるはずです。これは、行で使用される値でusageあり、ヘルプ行のいずれかで%(prog)s.

subparsers._prog_prefixから派生しますparser.prog(詳細についてはadd_subparsersコードを参照してください)。ただし、progパラメーターを指定することもできます。

sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2], prog='prog1')

これにより、行の文字列が修正されますhelp。ただし、文字列も変更されますusage

サブパーサーに明示的に与えることもできますusage:

sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2], prog='prog1', usage='master prog1 ...')

手術をしないと、使用法を変更せずにヘルプラインをHelpFormatter変更することはできないと思います.prog

また、 のヘルプ ラインを変更せずparentsに のヘルプ ラインを変更することはできません。 参照によって Action オブジェクトをコピーするため、2 つのサブパーサーが Action オブジェクトを共有します。prog1 fooprog2 fooparentsfoo

parents少なくともこの引数については、多くの人がアプローチを放棄し、名前をハードコーディングする必要があります。引数を複数のサブパーサーに追加する必要がある場合は、それを容易にするための小さなユーティリティ関数を記述します。このparentsメカニズムは (通常は) 便利で、入力や編集の手間を省くものです。


この変更されたスクリプトは私のポイントを説明します

parser = ArgumentParser(prog = 'master')

parser1 = ArgumentParser(add_help = False)
fooarg=parser1.add_argument('foo', type = int, help = 'foo prog: %(prog)s') # Line of interest
parser2 = ArgumentParser(add_help = False)
parser2.add_argument('--bar', type = int, default = 0, help = 'Start at this number')
parser3 = ArgumentParser(add_help = False)
parser3.add_argument('--baz', type = str, default = 'DEFAULT', help = 'Init file with this text')

subparsers = parser.add_subparsers(prog='subparsers')
sp1 = subparsers.add_parser('prog1', parents = [parser1, parser2], prog='name1')
sp2 = subparsers.add_parser('prog2', parents = [parser1, parser3])

#parser.print_help()

# fooarg is an Action for both subparsers
# print(fooarg.help)
# fooarg.help = 'FOO HELP'

print('==>sp1 prog:', sp1.prog)
sp1.print_help()
print('==>sp2 prog:', sp2.prog)
sp2.print_help()

sp1.prog = 'custom'
sp1.print_help()

# addition
fooarg.default = 'default'
fooarg.metavar = 'META'
fooarg.help = 'prog: %(prog)s, dest=%(dest)s, nargs=%(nargs)s, type=%(type)s, default=%(default)s'
sp1.print_help()

この最後のビットは、一連の Action 属性をヘルプに追加します。しかしprog、から来る唯一のものですparser

positional arguments:
  META        prog: custom, dest=foo, nargs=None, type=int, default=default
于 2016-12-28T22:02:29.970 に答える