2016-12-14 81 views
0

这很可能超出了argparse模块的范围,但我会尝试使用示例来描述我的问题。可变数量的narg参数Python Argparse

我有一些水果和一些文件归因于每个水果。特别是苹果,香蕉和橙子。苹果有10个文件与它关联,香蕉有7个,桔子有9个。我可以硬编码-a-b-o,每个都用nargs='+'在Python命令行脚本中处理这个玩具示例。但是,说我有可变数量的水果,或者是一个非常大的数字(可能是50)。硬编码每种类型的标志会很疯狂,这里最好的解决方案是什么?

+0

也许你可以写一个配置文件(json格式?)并将它用作python命令行中的参数 – iFlo

+0

您希望的接口的用法是什么样子? – user2357112

+0

类似于'python script.py -x1 a b c -x2 d e f -x3 g h i'?除了我可以继续下去,直到x100,x500,x10000000等。 –

回答

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 
+0

我想从配置文件中读取名称,然后根据您的建议生成参数可以解决问题,好的解决方案 –

0

可以使用nargs=7例如,它将只接受正好为7(或返回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'] `

+0

抱歉,您误解了我的问题。我知道如何指定我想要的参数的数量。我问是否有办法指定可变数量的可变数量的参数 –