使用 argparse 显示隐藏选项
Show hidden option using argparse
我正在使用 argprase 创建一个选项,这是一个非常具体的选项来完成一项特定的工作。该脚本目前有大约 30 个旋钮,并且大多数不经常使用。
我正在创建一个选项:
opt.add_argument('-opt',help="Some Help", help=argparse.SUPPRESS)
但我希望有两种方式来显示脚本的帮助:
my_script -help
my_script -help-long
我希望 -help-long 也显示所有隐藏的参数。我找不到执行此操作的方法。
有没有办法实现这种行为?
我认为没有支持此功能的内置方法。您可能可以通过直接检查 sys.argv
并使用它来修改构建解析器的方式来绕过它:
import sys
show_hidden_args = '--help-long' in sys.argv
opt = argparse.ArgumentParser()
opt.add_argument('--hidden-arg', help='...' if show_hidden_args else argparse.SUPPRESS)
opt.add_argument('--help-long', help='Show all options.', action='help')
args = opt.parse_args()
当然,如果一遍又一遍写起来太不方便,可以将其包装在辅助函数(或子类ArgumentParser
)中:
def add_hidden_argument(*args, **kwargs):
if not show_hidden_args:
kwargs['help'] = argparse.SUPPRESS
opt.add_argument(*args, **kwargs)
并且您可能想要添加一个非隐藏的 --help-long
参数,以便用户知道它应该做什么...
您可以通过子类化 ArgumentParser
和 _HelpAction
来实现某些目标:
class LongHelp(argparse._HelpAction):
def __init__(self,*args, **kwargs):
super().__init__(*args, **kwargs)
def __call__(cls, parser, namespace, values, option_string):
print(parser.long_help)
class ArgParserWithLongHelp(argparse.ArgumentParser):
def __init__(self):
super().__init__(self)
self.long_help = {}
self.add_argument("--long-help", action=LongHelp )
def add_argument(self, *args, **kwargs):
if kwargs.get('long_help'):
self.long_help.update({k:kwargs['long_help'] for k in args})
kwargs.pop('long_help')
super().add_argument(*args, **kwargs)
opt = ArgParserWithLongHelp()
opt.add_argument('-opt', help=argparse.SUPPRESS, long_help='Some extra help')
args = opt.parse_args()
这是@mgilson 答案的一个变体,查看 sys.argv
看看我们是否应该抑制一些帮助
import argparse
import sys
def hide_args(arglist):
for action in arglist:
action.help=argparse.SUPPRESS
hidelist=[]
parser = argparse.ArgumentParser()
a1 = parser.add_argument('--foo',help='normal')
a2 = parser.add_argument('--bar',help='hidden')
hidelist.append(a2)
if '-h' in sys.argv[1:]:
hide_args(hidelist)
args = parser.parse_args()
这里我选择将--help
解释为寻求长期帮助; -h
简称。我本可以添加一个单独的 --longhelp
参数。
1207:~/mypy$ python3 stack37303960.py --help
usage: stack37303960.py [-h] [--foo FOO] [--bar BAR]
optional arguments:
-h, --help show this help message and exit
--foo FOO normal
--bar BAR hidden
需要一个简短的帮助
1207:~/mypy$ python3 stack37303960.py -h
usage: stack37303960.py [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO normal
add_argument
returns 指向它创建的 Action
对象的指针。这里我把选中的保存在hidelist
中。然后我有条件地遍历该列表并将 help
更改为 SUPPRESS
。 Action 的许多属性可以在初始创建后更改(在交互式会话中进行实验)。
解析器还维护一个动作列表。默认 help
是 parser._actions
列表中的第一个。它使用此列表来解析和格式化帮助。
In [540]: parser._actions[0]
Out[540]: _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)
我正在使用 argprase 创建一个选项,这是一个非常具体的选项来完成一项特定的工作。该脚本目前有大约 30 个旋钮,并且大多数不经常使用。
我正在创建一个选项:
opt.add_argument('-opt',help="Some Help", help=argparse.SUPPRESS)
但我希望有两种方式来显示脚本的帮助:
my_script -help
my_script -help-long
我希望 -help-long 也显示所有隐藏的参数。我找不到执行此操作的方法。
有没有办法实现这种行为?
我认为没有支持此功能的内置方法。您可能可以通过直接检查 sys.argv
并使用它来修改构建解析器的方式来绕过它:
import sys
show_hidden_args = '--help-long' in sys.argv
opt = argparse.ArgumentParser()
opt.add_argument('--hidden-arg', help='...' if show_hidden_args else argparse.SUPPRESS)
opt.add_argument('--help-long', help='Show all options.', action='help')
args = opt.parse_args()
当然,如果一遍又一遍写起来太不方便,可以将其包装在辅助函数(或子类ArgumentParser
)中:
def add_hidden_argument(*args, **kwargs):
if not show_hidden_args:
kwargs['help'] = argparse.SUPPRESS
opt.add_argument(*args, **kwargs)
并且您可能想要添加一个非隐藏的 --help-long
参数,以便用户知道它应该做什么...
您可以通过子类化 ArgumentParser
和 _HelpAction
来实现某些目标:
class LongHelp(argparse._HelpAction):
def __init__(self,*args, **kwargs):
super().__init__(*args, **kwargs)
def __call__(cls, parser, namespace, values, option_string):
print(parser.long_help)
class ArgParserWithLongHelp(argparse.ArgumentParser):
def __init__(self):
super().__init__(self)
self.long_help = {}
self.add_argument("--long-help", action=LongHelp )
def add_argument(self, *args, **kwargs):
if kwargs.get('long_help'):
self.long_help.update({k:kwargs['long_help'] for k in args})
kwargs.pop('long_help')
super().add_argument(*args, **kwargs)
opt = ArgParserWithLongHelp()
opt.add_argument('-opt', help=argparse.SUPPRESS, long_help='Some extra help')
args = opt.parse_args()
这是@mgilson 答案的一个变体,查看 sys.argv
看看我们是否应该抑制一些帮助
import argparse
import sys
def hide_args(arglist):
for action in arglist:
action.help=argparse.SUPPRESS
hidelist=[]
parser = argparse.ArgumentParser()
a1 = parser.add_argument('--foo',help='normal')
a2 = parser.add_argument('--bar',help='hidden')
hidelist.append(a2)
if '-h' in sys.argv[1:]:
hide_args(hidelist)
args = parser.parse_args()
这里我选择将--help
解释为寻求长期帮助; -h
简称。我本可以添加一个单独的 --longhelp
参数。
1207:~/mypy$ python3 stack37303960.py --help
usage: stack37303960.py [-h] [--foo FOO] [--bar BAR]
optional arguments:
-h, --help show this help message and exit
--foo FOO normal
--bar BAR hidden
需要一个简短的帮助
1207:~/mypy$ python3 stack37303960.py -h
usage: stack37303960.py [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO normal
add_argument
returns 指向它创建的 Action
对象的指针。这里我把选中的保存在hidelist
中。然后我有条件地遍历该列表并将 help
更改为 SUPPRESS
。 Action 的许多属性可以在初始创建后更改(在交互式会话中进行实验)。
解析器还维护一个动作列表。默认 help
是 parser._actions
列表中的第一个。它使用此列表来解析和格式化帮助。
In [540]: parser._actions[0]
Out[540]: _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None)