2011-06-28 10 views
11

argparseを使用すると、ある範囲の数値を受け入れてリストに変換する方法はありますか?例えばPythonのargparseを使用して0〜5の形式で数値の範囲を受け入れますか?

python example.py --range 0-5 

は、そのフォームで入力コマンドライン引数いくつかの方法がありますし、で終わる:

args.range = [0,1,2,3,4,5] 

も入力--range 2 = [2]への可能性がありますか?

+1

私はそのような何かが内蔵されていることを疑います。 argparseに任意の文字列を受け入れ、それを自分自身で解析することはかなり簡単です。 – delnan

答えて

21

あなたは、type引数に独自のパーサーを書くことができます。

from argparse import ArgumentParser, ArgumentTypeError 
import re 

def parseNumList(string): 
    m = re.match(r'(\d+)(?:-(\d+))?$', string) 
    #^(or use .split('-'). anyway you like.) 
    if not m: 
     raise ArgumentTypeError("'" + string + "' is not a range of number. Expected forms like '0-5' or '2'.") 
    start = m.group(1) 
    end = m.group(2) or start 
    return list(range(int(start,10), int(end,10)+1)) 

parser = ArgumentParser() 
parser.add_argument('--range', type=parseNumList) 

args = parser.parse_args() 
print(args) 
~$ python3 z.py --range m 
usage: z.py [-h] [--range RANGE] 
z.py: error: argument --range: 'm' is not a range of number. Expected forms like '0-5' or '2'. 

~$ python3 z.py --range 2m 
usage: z.py [-h] [--range RANGE] 
z.py: error: argument --range: '2m' is not a range of number. Expected forms like '0-5' or '2'. 

~$ python3 z.py --range 25 
Namespace(range=[25]) 

~$ python3 z.py --range 2-5 
Namespace(range=[2, 3, 4, 5]) 
7

文字列引数を使用して、range(*rangeStr.split(','))と解析するだけです。

関連する問題