使用argparse显示隐藏选项

时间:2016-05-18 15:25:44

标签: python argparse

我使用argprase创建一个选项,它是一个非常具体的选项,可以完成一项特定的工作。该脚本目前大约有30个旋钮,大部分都没有定期使用。

我正在创建一个选项:

opt.add_argument('-opt',help="Some Help", help=argparse.SUPPRESS)

但我希望有两种方法可以显示脚本的帮助:

my_script -help
my_script -help-long

我希望-help-long也显示所有隐藏的args。我无法找到办法做到这一点。

有没有办法实现这种行为?

3 个答案:

答案 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的许多属性。

解析器还维护一个操作列表。默认helpparser._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()