位置参数的格式 argparse 帮助

Format argparse help for positional arguments

默认 argparse 帮助输出很难看:

usage: gl.EXE [-h] [--version]
              {track,untrack,status,diff,commit,branch,tag,checkout,merge,resolve,fuse,remote,publish,switch,init,history}
              ...

Gitless - a version control system built on top of Git - http://gitless.com

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

subcommands:
  {track,untrack,status,diff,commit,branch,tag,checkout,merge,resolve,fuse,remote,publish,switch,init,history}
    track               start tracking changes to files
    untrack             stop tracking changes to files
    status              show status of the repo
...

如何将输出格式化为与下面的示例完全一样。保留命令顺序

Gitless - a version control system built on top of Git - http://gitless.com

commands:

  track               start tracking changes to files
  untrack             stop tracking changes to files
  status              show status of the repo
...

子类化 argparse.RawDescriptionHelpFormatter 工作量太大,所以我使用这个 hack 来提取命令列表并构建我自己的消息。

def print_help(parser):
  """print help for humans"""
  print(parser.description)
  print('\ncommands:\n')

  # 
  # retrieve subparsers from parser
  subparsers_actions = [
      action for action in parser._actions 
      if isinstance(action, argparse._SubParsersAction)]
  # there will probably only be one subparser_action,
  # but better save than sorry
  for subparsers_action in subparsers_actions:
      # get all subparsers and print help
      for choice in subparsers_action._choices_actions:
          print('    {:<19} {}'.format(choice.dest, choice.help))