我想以以下样式在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