0

我有这个示例代码:

from argparse import ArgumentParser

parser = ArgumentParser()

parser.add_argument('config')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose')
group.add_argument('--quiet')

commands = parser.add_subparsers()
command = commands.add_parser('upload')
command.add_argument('path')
command.add_argument('--url')
command = commands.add_parser('check')
group = command.add_mutually_exclusive_group()
group.add_argument('--md5')
group.add_argument('--path')

if __name__=='__main__':
    parser.parse_args()

使用 --help 运行它会给出:

usage: argparse_example.py [-h] [--verbose VERBOSE | --quiet QUIET]
                           config {upload,check} ...

positional arguments:
  config
  {upload,check}

optional arguments:
  -h, --help         show this help message and exit
  --verbose VERBOSE
  --quiet QUIET

我希望它显示的是:

usage: argparse_example.py [-h] [--verbose VERBOSE | --quiet QUIET]
                           config {upload,check} ...

positional arguments:
  config
  {upload,check}

optional arguments:
  -h, --help         show this help message and exit
  --verbose VERBOSE
  --quiet QUIET

sub-commands:

upload [-h] [--url URL] path

    positional arguments:
      path

    optional arguments:
      -h, --help  show this help message and exit
      --url URL

check [-h] [--md5 MD5 | --path PATH]

    optional arguments:
      -h, --help   show this help message and exit
      --md5 MD5
      --path PATH

我确实尝试过实现 HelpFormatter 子类,但很快就迷路了。

有没有人有这样一个子类的可行实现?

4

1 回答 1

0

这足够接近吗?除了调整titleand之外prog,我还创建了所有帮助字符串,缩进子解析器,并将它们组合成字符串。

parser = ArgumentParser(prog='PROG')

parser.add_argument('config')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose')
group.add_argument('--quiet')

commands = parser.add_subparsers(title='subcommands')
command1 = commands.add_parser('upload',prog='upload')
command1.add_argument('path')
command1.add_argument('--url')
command2 = commands.add_parser('check',prog='check')
group = command2.add_mutually_exclusive_group()
group.add_argument('--md5')
group.add_argument('--path')

fmt1 = parser.format_help()
fmt2 = command1.format_help()
fmt2 = fmt2.replace('usage: ','')
fmt2 = fmt2.replace('\n','\n  ')
fmt3 = command2.format_help()
fmt3 = fmt3.replace('usage: ','')
fmt3 = fmt3.replace('\n','\n  ')
print('%s\n%s\n%s'%(fmt1,fmt2,fmt3))

产生:

usage: PROG [-h] [--verbose VERBOSE | --quiet QUIET] config {upload,check} ...

positional arguments:
  config

optional arguments:
  -h, --help         show this help message and exit
  --verbose VERBOSE
  --quiet QUIET

subcommands:
  {upload,check}

upload [-h] [--url URL] path

  positional arguments:
    path

  optional arguments:
    -h, --help  show this help message and exit
    --url URL

check [-h] [--md5 MD5 | --path PATH]

  optional arguments:
    -h, --help   show this help message and exit
    --md5 MD5
    --path PATH

调用此输出是另一个问题。它应该由parser.format_help(), 即-h. 通过另一个行为相同的可选?通过常规可选?

于 2013-08-21T23:20:19.690 回答