12

argparseを使用して、数値の範囲を受け入れ、それらをリストに変換する方法はありますか?

例えば:

python example.py --range 0-5

その形式でコマンドライン引数を入力して、最終的に次のようになる方法はありますか?

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

また、入力する可能性があります--range 2 = [2]か?

4

2 に答える 2

24

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])
于 2011-06-28T20:05:44.393 に答える
8

文字列引数を使用して、 で解析できますrange(*rangeStr.split(','))

于 2011-06-28T19:52:18.957 に答える