使用 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 的许多属性可以在初始创建后更改(在交互式会话中进行实验)。

解析器还维护一个动作列表。默认 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)