2015-11-03 89 views
6

我需要让我的python脚本类型有点像最终用户:如何用argparse创建类型为“pair of list”的参数?

script.py -sizes <2,2> <3,3> <6,6> 

其中-sizes选项中的每个元素是一对两个正整数。我怎样才能达到这个​​?

+0

是输入准确'<2,2><3,3>'或'2,2 3,3 4,4' – idjaw

+0

@idjaw输入没有规定。我只需要让用户输入尺寸由两个整数(x和y尺寸) –

+2

'nargs = 2'和'action ='append''让你解析'-s 2 2 -s 3 3 -s 6 6 ”。 – hpaulj

回答

7

定义自定义类型:

def pair(arg): 
    # For simplity, assume arg is a pair of integers 
    # separated by a comma. If you want to do more 
    # validation, raise argparse.ArgumentError if you 
    # encounter a problem. 
    return [int(x) for x in arg.split(',')] 

然后用这个作为类型的常规参数:

p.add_argument('--sizes', type=pair, nargs='+') 

然后

>>> p.parse_args('--sizes 1,3 4,6'.split()) 
Namespace(sizes=[[1, 3], [4, 6]]) 
+0

但请注意' - 大小1,3,4 ,6'。 shell将分割这些对。 – hpaulj

+0

我把它放在用户错误的类别中;正如定义的'--sizes'的正确使用*要求*参数是正确的。 – chepner

1

Argparse不会尝试覆盖所有可能的输入数据格式。你总是可以得到sizes为字符串,并用几行代码解析它们:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--sizes', nargs='+') 

args = parser.parse_args() 

try: 
    sizes = [tuple(map(int, s.split(',', maxsplit=1))) for s in args.sizes] 
except Exception: 
    print('sizes cannot be parsed') 

print(sizes) 

“特殊情况是不够的特殊打破规则。”

相关问题