在argparse可选参数之间添加额外的描述



我想以以下样式在argaparse中的可选参数组之间添加一个额外的描述:

script --help
usage: script [options] <COMMAND>
A script
optional arguments:
-h, --help            show this help message and exit
-f FOO, --foo FOO     show FOO
following commands modify FOO output:
-lower                show FOO in lowercase
-upper                show FOO in CAPS
following commands redirect FOO:
-to-file              write FOO to file

好吧,我想你已经在问题标题中提到了argparse,你的输出样本看起来与使用ArgumentParser生成的样本非常相似。如果你只想要一个代码示例,你可以从我留下的注释中提取,但我决定添加一些解释。

基本上,问题的解决方案是使用ArgumentParser.add_argument_group()创建单独的组。传递给description参数的文本将在添加到此组的参数的帮助之前打印(除了一些额外的换行符之外,正是您想要的(

现在介绍一些关于这个特殊情况的实现技巧。

由于--lower--upper参数应该只存储一个布尔值,我建议为两个参数设置相同的目的地(例如is_lower(,并使用store_true/store_false操作。此外,由于逻辑上只能同时使用其中一个参数,因此最好使用ArgumentParser.add_mutually_exclusive_group()将两者添加到互斥组中。代码:

from argparse import ArgumentParser
...
parser = ArgumentParser(description="A script")
...
modify_group = parser.add_argument_group(
description="following commands modify FOO output:"
)
modify_exclusive_group = modify_group.add_mutually_exclusive_group()
modify_exclusive_group.add_argument(
"--lower",
action="store_true",
dest="is_lower",
default=True,
help="show FOO in lowercase"
)
modify_exclusive_group.add_argument(
"--upper",
action="store_false",
dest="is_lower",
help="show FOO in CAPS"
)

--to-file的争论情况大不相同。首先,我根本不添加它,因为输出重定向可以在控制台(python script.py > out.txt(中完成。但如果您仍然想实现它,您可以使用特殊的文件类型argparse.FileType,它允许解析器在特定模式下打开文件句柄。根据您的代码,您可能会以任何可能的方式使用打开的文件,我将展示通过用打开的文件对象替换sys.stdout来将所有输出重定向到文件中的常见方法。代码:

import sys
from argparse import FileType
...
redirect_group = parser.add_argument_group(
description="following commands redirect FOO:"
)
redirect_group.add_argument(
"--to-file",
type=FileType("w"),
dest="stdout",
default=sys.stdout,
help="write FOO to file",
metavar=""  # set name here to add variable in help message
)
...
args = parser.parse_args()
sys.stdout = args.stdout

将所有这些结合在一起,并添加一些简单的任务来打印随机字符串,您将获得下一个代码:

import sys
from argparse import ArgumentParser, FileType
from random import randrange, choices
from string import ascii_letters
parser = ArgumentParser(description="A script")
parser.add_argument("-f", "--foo", help="show FOO")
modify_group = parser.add_argument_group(
description="following commands modify FOO output:"
)
modify_exclusive_group = modify_group.add_mutually_exclusive_group()
modify_exclusive_group.add_argument(
"--lower", 
action="store_true", 
dest="is_lower", 
default=True,
help="show FOO in lowercase"
)
modify_exclusive_group.add_argument(
"--upper",
action="store_false",
dest="is_lower",
help="show FOO in CAPS"
)
redirect_group = parser.add_argument_group(
description="following commands redirect FOO:"
)
redirect_group.add_argument(
"--to-file",
type=FileType("w"),
dest="stdout",
default=sys.stdout,
help="write FOO to file",
metavar=""
)
args = parser.parse_args()
sys.stdout = args.stdout
modify_method = str.lower if args.is_lower else str.upper
for _ in range(randrange(5, 10)):
random_string = "".join(choices(ascii_letters, k=randrange(10, 20)))
print(modify_method(random_string))

帮助信息:

usage: script.py [-h] [-f FOO] [--lower | --upper] [--to-file]
A script
optional arguments:
-h, --help         show this help message and exit
-f FOO, --foo FOO  show FOO
following commands modify FOO output:
--lower            show FOO in lowercase
--upper            show FOO in CAPS
following commands redirect FOO:
--to-file          write FOO to file

相关内容

  • 没有找到相关文章

最新更新