Python argparse:有没有办法只打印特定参数的帮助?

Python argparse: Is there a way to print help for only a specific parameter?

我有一长串参数,所以 mycommand --help 的输出变得非常大。我想为我的用户提供一种获取特定参数帮助文本的方法。

类似这样的东西(不起作用,显示整个帮助文本)

mycommand --help --parameter-of-interest

如果可以避免,我不想将所有内容都拆分成子解析器。

您可以创建自己的操作来实现此目的。这两个都将迭代可选参数并抑制在 sys.argv 中找不到的任何参数。我推荐解释操作,因为这不会与 -h/--help 标志混淆。

解释操作

这将创建一个操作 ExplainParamsAction,其中包含相应的 -e/--explain 选项,用于过滤指定参数的帮助文本。

import sys
import argparse

class ExplainParamsAction(argparse.Action):
    def __init__(
        self,
        option_strings,
        dest=argparse.SUPPRESS,
        default=argparse.SUPPRESS,
        **kwargs
    ):
        super().__init__(option_strings, dest, default=default, nargs=0, **kwargs)

    def __call__(self, parser, namespace, values, option_string=None):
        opts = parser._option_string_actions
        for arg in opts:
            if arg not in sys.argv:
                setattr(opts[arg], "help", argparse.SUPPRESS)
        parser.print_help()
        parser.exit()

parser = argparse.ArgumentParser()
parser.add_argument(
    "-e",
    "--explain",
    action=ExplainParamsAction,
    help="Show help message for only specified parameters and exit",
)
parser.add_argument("--url", help="URL to the resource")
parser.add_argument("--port", help="Port to the resource")
parser.add_argument("--timeout", help="Connection timeout")
args = parser.parse_args()

覆盖帮助操作

或者,您可以覆盖提供给解析器的帮助操作。 要与 argparse.ArgumentParser 一起使用,您需要关闭默认助手并提供您自己的助手。

import sys
import argparse

class _CustomHelpAction(argparse._HelpAction):
    def __call__(self, parser, namespace, values, option_string=None):
        args = sys.argv[1:]
        opts = parser._option_string_actions
        # Check is needed for just -h/--help to work
        if len(args) > 1:
            for arg in opts:
                if arg not in args:
                    setattr(opts[arg], "help", argparse.SUPPRESS)
        super().__call__(parser, namespace, values, option_string)


# Init parser with help turned off
parser = argparse.ArgumentParser(add_help=False)

# Register your help action and manually add the `-h/--help` option
parser.register("action", "help", _CustomHelpAction)
parser.add_argument("-h", "--help", action="help", help="show this help message and exit")

# Add remaining arguments
parser.add_argument("--url", help="URL to the resource")
parser.add_argument("--port", help="Port to the resource")
parser.add_argument("--timeout", help="Connection timeout")
args = parser.parse_args()

用法示例:

全部帮助:

python3 script.py --help
usage: script.py [-h] [--url URL] [--port PORT] [--timeout TIMEOUT]

optional arguments:
  -h, --help
  --url URL          URL to the resource
  --port PORT        Port to the resource
  --timeout TIMEOUT  Connection timeout

具体参数:

~ python3 script.py -h --url --timeout
usage: script.py [--url URL] [--timeout TIMEOUT]

optional arguments:
  --url URL          URL to the resource
  --timeout TIMEOUT  Connection timeout
~ python3 script.py -h --timeout --port
usage: script.py [--timeout TIMEOUT] [--port PORT]

optional arguments:
  --port PORT        Port to the resource
  --timeout TIMEOUT  Connection timeout

这天真地假设您只使用 sys.argv,我不确定如果不是,我需要做什么。

这里已经讨论过了:

本质上,您可以通过添加 --help 作为参数来覆盖帮助。

编辑:自定义帮助可以指向获取特定参数帮助的语法,例如 -s parameter_you_wish_help_about.

编辑 2:尚未测试,但大致如此。

parser.add_argument('-s',action='store',dest='para', type=str, help='Get Help on specific parameter')
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS, help='Use -s to get help on specific parameter')

help_dict={}
help_dict['para_1']='Help on para_1'
print (help_dict[args.para])