Python argparse 类帮助选项

Python argparse help-like option

我正在编写一个 python 脚本,它有两个参数和一些选项:

scriptname [-h] [-l] [-q|-d] arg1 arg2

-q(安静)和-d(调试)选项改变冗长级别,-h选项是argparse自动创建的帮助选项。

我希望 -l(列表)选项的行为类似于 -h 选项,因为它将 不需要(否则为强制性)参数存在 并列出一些有用的信息(不同于 -h 选项)。实际上,这意味着可以通过以下三种方式调用脚本:

scriptmane [-q|-d] arg1 arg2
scriptname -l
scriptname -h

两种可能的前进方式是:

  1. 使参数可选(使用 nargs='?')并添加代码以验证在所有未给出 -l-h 选项的情况下是否有两个参数。
  2. 编写一个自定义操作class(不确定细节)。

但我希望有更直接的方法从帮助选项继承 "this option is all you need" 行为。


解决方案(基于samwyse的回答):

基于argparse.py中的_HelpAction()

class _ListAction(argparse.Action):
    def __init__(self,
                 option_strings,
                 dest=argparse.SUPPRESS,
                 default=argparse.SUPPRESS,
                 help=None):
        super(_ListAction, self).__init__(
            option_strings=option_strings,
            dest=dest,
            default=default,
            nargs=0,
            help=help)

    def __call__(self, parser, namespace, values, option_string=None):
        print_list()
        parser.exit()

然后,在解析器设置期间:

    parser.add_argument('-l', '--list', action=_ListAction, 
                        help="List all available cases")

您可以使用 argparse 轻松做到这一点。以下将支持 -l--list 作为额外的帮助选项:

parser.add_argument("-l", "--list", action="help")

如果您不想支持长格式 (--list),只需将其从参数列表中省略即可。

如果选项 "list" 旨在具有与 "help" 不同的行为,那么您需要编写自定义操作。好消息是这样做非常简单。 argparse 的主页为您提供了提示,您只需要意识到在参数列表中看到该选项后就会立即调用该操作。在新动作的调用中(每端应该有两个下划线,但 Markdown 使用它们来强调)方法,做任何你需要为你的选项做的事情,然后调用 parser.exit() 来短路任何更多的处理参数。

在此处查看 _HelpAction 和 _VersionAction 的源代码:https://github.com/ThomasWaldmann/argparse/blob/master/argparse.py(可能只是将其中之一子类化以跳过编写初始化代码)。