narg 参数的可变数量 Python Argparse
Variable Number of narg Arguments Python Argparse
这可能超出了 argparse 模块的范围,但我将尝试使用示例来描述我的问题。
我有一些水果和一些属于每个水果的文件。特别是苹果、香蕉和橙子。 Apple 有 10 个与之关联的文件,Banana 有 7 个,而 Oranges 有 9 个。我可以硬编码 -a
、-b
、-o
,每个 nargs='+'
来处理这个玩具示例Python 命令行脚本。但是假设我有可变数量的水果,或者数量非常多(可能是 50 个)。为每种类型硬编码一个标志会很疯狂,这里最好的解决方案是什么?
您可以使用 nargs=7
例如,它只会接受恰好 7(或者 return None
如果没有输入标志)
例如,添加
parser.add_argument('-x', nargs=7, help='testing')
到你的参数列表
和
print args.x
假设您的文件是 a.py
$ python a.py
> None
$ python a.py -x 1
> a.py: error: argument -x: expected 7 argument(s)
$ python a.py -x 1 2 3 4 5 6 7
> ['1', '2', '3', '4', '5', '6', '7']
`
我会为每个水果创建一个参数,但我会以 DRYest 我可以的方式进行:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--insecticide")
for fruit, nargs in (
('Apple', 10),
('Banana', 7),
('Orange', 9),
):
parser.add_argument(
"--" + fruit.lower(), nargs=nargs, metavar='FLIES',
help="specify {} species of {} pests".format(nargs, fruit))
args = parser.parse_args()
print(args)
这是生成的帮助消息:
$ python x.py -h
usage: x.py [-h] [-i INSECTICIDE]
[--apple FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
[--banana FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
[--orange FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
optional arguments:
-h, --help show this help message and exit
-i INSECTICIDE, --insecticide INSECTICIDE
--apple FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 10 species of Apple pests
--banana FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 7 species of Banana pests
--orange FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 9 species of Orange pests
如果有可变数量的水果(例如,由环境变量控制,或配置文件的存在),那么我的循环不会被硬编码,而是可能是:
for config_section in config_data():
parser.add_argument("--" + config_section.name, ...)
如果我想按顺序命名参数,正如 OP 的评论所建议的那样,我可能会编写循环代码:
for i, fruit in enumerate(fruit_names, 1):
parser.add_argument("--x{}".format(i),
nargs="+",
help="{} files".format(fruit))
这是生成的帮助消息:
$ python x2.py -h
usage: x2.py [-h] [-i INSECTICIDE] [--x1 X1 [X1 ...]] [--x2 X2 [X2 ...]]
[--x3 X3 [X3 ...]]
optional arguments:
-h, --help show this help message and exit
-i INSECTICIDE, --insecticide INSECTICIDE
--x1 X1 [X1 ...] Apple files
--x2 X2 [X2 ...] Banana files
--x3 X3 [X3 ...] Orange files
这可能超出了 argparse 模块的范围,但我将尝试使用示例来描述我的问题。
我有一些水果和一些属于每个水果的文件。特别是苹果、香蕉和橙子。 Apple 有 10 个与之关联的文件,Banana 有 7 个,而 Oranges 有 9 个。我可以硬编码 -a
、-b
、-o
,每个 nargs='+'
来处理这个玩具示例Python 命令行脚本。但是假设我有可变数量的水果,或者数量非常多(可能是 50 个)。为每种类型硬编码一个标志会很疯狂,这里最好的解决方案是什么?
您可以使用 nargs=7
例如,它只会接受恰好 7(或者 return None
如果没有输入标志)
例如,添加
parser.add_argument('-x', nargs=7, help='testing')
到你的参数列表
和
print args.x
假设您的文件是 a.py
$ python a.py
> None
$ python a.py -x 1
> a.py: error: argument -x: expected 7 argument(s)
$ python a.py -x 1 2 3 4 5 6 7
> ['1', '2', '3', '4', '5', '6', '7'] `
我会为每个水果创建一个参数,但我会以 DRYest 我可以的方式进行:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--insecticide")
for fruit, nargs in (
('Apple', 10),
('Banana', 7),
('Orange', 9),
):
parser.add_argument(
"--" + fruit.lower(), nargs=nargs, metavar='FLIES',
help="specify {} species of {} pests".format(nargs, fruit))
args = parser.parse_args()
print(args)
这是生成的帮助消息:
$ python x.py -h
usage: x.py [-h] [-i INSECTICIDE]
[--apple FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
[--banana FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
[--orange FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES]
optional arguments:
-h, --help show this help message and exit
-i INSECTICIDE, --insecticide INSECTICIDE
--apple FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 10 species of Apple pests
--banana FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 7 species of Banana pests
--orange FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES FLIES
specify 9 species of Orange pests
如果有可变数量的水果(例如,由环境变量控制,或配置文件的存在),那么我的循环不会被硬编码,而是可能是:
for config_section in config_data():
parser.add_argument("--" + config_section.name, ...)
如果我想按顺序命名参数,正如 OP 的评论所建议的那样,我可能会编写循环代码:
for i, fruit in enumerate(fruit_names, 1):
parser.add_argument("--x{}".format(i),
nargs="+",
help="{} files".format(fruit))
这是生成的帮助消息:
$ python x2.py -h
usage: x2.py [-h] [-i INSECTICIDE] [--x1 X1 [X1 ...]] [--x2 X2 [X2 ...]]
[--x3 X3 [X3 ...]]
optional arguments:
-h, --help show this help message and exit
-i INSECTICIDE, --insecticide INSECTICIDE
--x1 X1 [X1 ...] Apple files
--x2 X2 [X2 ...] Banana files
--x3 X3 [X3 ...] Orange files