我正在编写一个带有两个参数的python脚本,以及一些选项:
scriptname [-h] [-l] [-q|-d] arg1 arg2
该-q
(安静)和-d
(调试)选项更改的详细级别,而-h
选择是通过argparse自动创建的帮助选项.
我希望-l
(list)选项的行为与-h
选项类似,因为它不需要(否则是强制的)参数,并列出一些有用的信息(与-h
选项不同).实际上,这意味着可以通过以下三种方式调用脚本:
scriptmane [-q|-d] arg1 arg2 scriptname -l scriptname -h
两种可能的前进方式是:
使参数可选(与NARGS ="?"),并添加代码,以验证是否有在那里所有的情况下两个参数-l
OG -h
选项都没有给出.
编写自定义操作类(不确定详细信息).
但我希望有一种更简单的方法可以从帮助选项继承"此选项就是您所需要的"行为.
解决方案(基于samwyse的回答):
基于_HelpAction()
in argparse.py:
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.. 5
如果选项“列表”与“帮助”具有不同的行为,则需要编写自定义操作。好消息是,这样做非常简单。argparse的主页提供了提示,您只需意识到在参数列表中看到该选项后便立即调用该动作。在新操作的调用中(该操作在每个末端应有两个下划线,但markdown会使用这些下划线来强调),对您的选项做任何需要做的事情,然后调用parser.exit()来缩短对更多参数的处理。
在此处查看_HelpAction和_VersionAction的源代码:https : //github.com/ThomasWaldmann/argparse/blob/master/argparse.py(可能只是其中一个子类以跳过编写初始化代码)。
如果选项“列表”与“帮助”具有不同的行为,则需要编写自定义操作。好消息是,这样做非常简单。argparse的主页提供了提示,您只需意识到在参数列表中看到该选项后便立即调用该动作。在新操作的调用中(该操作在每个末端应有两个下划线,但markdown会使用这些下划线来强调),对您的选项做任何需要做的事情,然后调用parser.exit()来缩短对更多参数的处理。
在此处查看_HelpAction和_VersionAction的源代码:https : //github.com/ThomasWaldmann/argparse/blob/master/argparse.py(可能只是其中一个子类以跳过编写初始化代码)。