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
两种可能的前进方式是:
- 使参数可选(使用 nargs='?')并添加代码以验证在所有未给出
-l
和 -h
选项的情况下是否有两个参数。
- 编写一个自定义操作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(可能只是将其中之一子类化以跳过编写初始化代码)。
我正在编写一个 python 脚本,它有两个参数和一些选项:
scriptname [-h] [-l] [-q|-d] arg1 arg2
-q
(安静)和-d
(调试)选项改变冗长级别,-h
选项是argparse自动创建的帮助选项。
我希望 -l
(列表)选项的行为类似于 -h
选项,因为它将 不需要(否则为强制性)参数存在 并列出一些有用的信息(不同于 -h
选项)。实际上,这意味着可以通过以下三种方式调用脚本:
scriptmane [-q|-d] arg1 arg2
scriptname -l
scriptname -h
两种可能的前进方式是:
- 使参数可选(使用 nargs='?')并添加代码以验证在所有未给出
-l
和-h
选项的情况下是否有两个参数。 - 编写一个自定义操作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(可能只是将其中之一子类化以跳过编写初始化代码)。