我使用argprase创建一个选项,它是一个非常具体的选项,可以完成一项特定的工作。该脚本目前大约有30个旋钮,大部分都没有定期使用。
我正在创建一个选项:
opt.add_argument('-opt',help="Some Help", help=argparse.SUPPRESS)
但我希望有两种方法可以显示脚本的帮助:
my_script -help
my_script -help-long
我希望-help-long也显示所有隐藏的args。我无法找到办法做到这一点。
有没有办法实现这种行为?
答案 0 :(得分:9)
我不认为有一种内置的方式来支持这一点。您可以通过直接检查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
参数,以便用户知道它应该做什么......
答案 1 :(得分:2)
这是@ 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
返回指向它创建的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)
答案 2 :(得分:1)
您可以通过继承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()