2015-11-03 76 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) 

「特殊情況是不夠的特殊打破規則。」

相關問題