gpt4 book ai didi

python - 根据 argparse 值调用具有不同参数的函数

转载 作者:太空宇宙 更新时间:2023-11-03 16:54:16 25 4
gpt4 key购买 nike

我需要按以下样式为我的程序形成帮助:

  • run.py -h -> 通用帮助
  • run.py module1 -h -> 生成的模块的帮助文本build_help(mod)
  • run.py module1 submodule1 -h -> 给定子模块 (submodule1) 的帮助文本,也由函数生成。

第一部分非常简单。第三条是第二条的延伸。但我无法实现第二部分。

我尝试使用subparser,但据我了解,我应该编写太多代码来实现这一点。例如:

subparsers = parser.add_subparsers()
parser_module1 = subparsers.add_parser('module1')
parser_module1.set_defaults(func=build_help)

并为每个模块迭代最后两行。

如果使用仅一个子解析器,我也可以实现:

subparsers = parser.add_subparsers()
parser_module = subparsers.add_parser('module')
parser_module.add_argument('name', help='Module name')
parser_module.set_defaults(func=build_help)

但是我将被迫将第二部分修改为

run.py module module1 -h

如果我不想更改调用模式(我需要保留 run.py module1 -h 模式),如何实现帮助的第二部分?

UPD。我知道,有很多外部库可能会这样做。例如,getopt , docopt , click , consoleargs等等。但我真的不想为此任务创建外部依赖项。

最佳答案

argparse.ArgumentParser(add_help=False) 关闭自动 help 机制。换句话说,它不会自动创建响应 -h 的参数。然后您可以定义自己的 -h 参数。

当我创建常规解析器时:

In [56]: parser = argparse.ArgumentParser()

In [57]: parser
Out[57]: ArgumentParser(prog='ipython2.7', usage=None, description=None, version=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)

In [59]: parser._actions
Out[59]: [_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)]

_actions列表包含-h操作。查看 argparse._HelpAction 类以了解它的特殊之处。基本上它会显示帮助并调用sys.exit

例如,我可以创建一个行为相同但响应 -q 的操作:

In [62]: parser.add_argument('-q',action='help')
Out[62]: _HelpAction(option_strings=['-q'], dest='q', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help=None, metavar=None)

In [63]: parser.parse_args(['-q'])
usage: ipython2.7 [-h] [-q]

optional arguments:
-h, --help show this help message and exit
-q
An exception has occurred, use %tb to see the full traceback.

SystemExit: 0

To exit: use 'exit', 'quit', or Ctrl-D.

子解析器会发出不同的帮助,因为主解析器在遇到 -h 之前先遇到子解析器名称。因此,是子解析器发出帮助,而不是主解析器。

希望此描述能为您提供构建所需内容的构建 block 。如果您需要更详细的帮助,我们可以进行更多对话。

请注意,我使用 ipython 作为示例。它使用argparse。但它在调用解析器之前捕获了 sys.argv 中的 -h/help。因此它可以完全控制帮助消息。

另一个自定义路线 - 定义您自己的 parser.format_help 函数。

关于python - 根据 argparse 值调用具有不同参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com