Python argparse 帮助类选项

13

我正在编写一个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. 编写自定义操作类(不确定细节)。

但我希望有一种更直接的方法来继承“此选项是您所需的全部”行为。


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

正是我所想的,但因为我在手机上,很难编码。 :) - samwyse
这似乎是一个应该更容易实现的选项。 - masher
1个回答

7
如果选项"list"的行为与"help"不同,则需要编写自定义操作。好消息是,这很容易做到。argparse的主页面给出了提示,你只需要意识到该操作在看到选项时立即调用。在新操作的调用方法中(应该在每端具有两个下划线,但Markdown将其用于强调),对于你的选项,执行任何你需要执行的操作,然后调用parser.exit()以终止处理更多参数的过程。
查看此处_HelpAction和_VersionAction的源代码:https://github.com/ThomasWaldmann/argparse/blob/master/argparse.py (可能只需子类化它们中的一个来跳过编写init代码)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接