可变数量的narg参数Python Argparse

时间:2016-12-14 16:55:18

标签: python argparse

这可能超出了argparse模块的范围,但我会尝试使用示例来描述我的问题。

我有一些水果和一些归因于每个水果的文件。特别是Apple,Banana和Orange。 Apple有10个与之相关的文件,Banana有7个,而Orange有9个。我可以硬编码-a-b-o每个人nargs='+'来处理这个玩具示例Python命令行脚本。但是说我的水果数量可变,或者数量非常大(可能是50)。对每种类型的标记进行硬编码会很疯狂,这里最好的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

我会为每个成果创建一个论点,但我会以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

答案 1 :(得分:0)

例如,你可以使用nargs=7,它只接受7(如果没有输入标志,则返回None

例如,添加

parser.add_argument('-x', nargs=7, help='testing')

到您的参数列表 和 print args.x

说你的文件是a.py

  

$ python a.py

     

>无

     

$ python a.py -x 1

     

> a.py:错误:参数-x:预期的7个参数

     

$ python a.py -x 1 2 3 4 5 6 7

     

> ['1','2','3','4','5','6','7']   `