Python argparse类似帮助的选项

时间:2015-12-18 09:34:00

标签: python argparse

我正在编写一个带有两个参数的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 og -h选项的所有情况下有两个参数。
  2. 编写自定义操作类(不确定详细信息)。
  3. 但我希望有一种更简单的方法可以从帮助选项中继承“此选项就是您所需要的”行为。

    解决方案(基于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")
    

2 个答案:

答案 0 :(得分:5)

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

在这里查看_HelpAction和_VersionAction的源代码:https://github.com/ThomasWaldmann/argparse/blob/master/argparse.py(可能只是将其中一个子类化为跳过编写init代码)。

答案 1 :(得分:1)

您可以使用argparse轻松完成此操作。以下内容将支持-l--list作为其他帮助选项:

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

如果您不想支持长格式(--list),只需在参数列表中省略它。