我正在编写一个带有两个参数的python脚本,以及一些选项:
scriptname [-h] [-l] [-q|-d] arg1 arg2
-q
(安静)和-d
(调试)选项会更改详细级别,-h
选项是argparse自动创建的帮助选项。
我希望-l
(列表)选项的行为与-h
选项类似,因为它不要求(否则是强制的)参数存在和列出一些有用的信息(与-h
选项不同)。实际上,这意味着可以通过以下三种方式调用脚本:
scriptmane [-q|-d] arg1 arg2
scriptname -l
scriptname -h
前进的两种可能方式是:
-l
og -h
选项的所有情况下有两个参数。但我希望有一种更简单的方法可以从帮助选项中继承“此选项就是您所需要的”行为。
解决方案(基于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")
答案 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
),只需在参数列表中省略它。