2011-06-28 4 views
11

Argparse का उपयोग करना, संख्याओं की एक श्रृंखला को स्वीकार करने और उन्हें एक सूची में बदलने का कोई तरीका है?पायथन के 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(',')) से पार्स कर सकते हैं।

संबंधित मुद्दे