2010-11-16 16 views
22

मेरे पास एक वैकल्पिक तर्क है जो तर्कों की एक सूची का समर्थन करता है।पायथन Argparse: क्या नर्ग में एक सीमा निर्दिष्ट करने का कोई तरीका है?

मेरा मतलब है, यह समर्थन करना चाहिए:

  • -f 1 2
  • -f 1 2 3

लेकिन नहीं:

  • -f 1
  • -एफ 1 2 3 4

क्या Argparse के भीतर इसे मजबूर करने का कोई तरीका है? अब मैं nargs = "*" का उपयोग कर रहा हूं, और फिर सूची की लंबाई की जांच कर रहा हूं।

संपादित करें: अनुरोध के अनुसार, मुझे जो चाहिए वह स्वीकार्य संख्या की तर्कों को परिभाषित करने में सक्षम है। मेरा मतलब है, (उदाहरण में) 2 या 3 आर्ग सही है कह, लेकिन नहीं 1 या 4 या कुछ भी है कि सीमा के अंदर नहीं है 2..3

+0

मुझे समझ में नहीं आता क्या आपका मतलब है कि आप समर्थन करने में सक्षम होना चाहते हैं उदा। एक और दस तर्कों के बीच? – katrielalex

+5

क्या आप कृपया नियमों के बारे में विस्तार से बता सकते हैं? आप कम से कम 2, और अधिकतम 3 मूल्यों की आवश्यकता है? क्या उन्हें 1-4 होना चाहिए या वे कुछ भी हो सकते हैं? – slf

उत्तर

15

आप एक custom action के साथ ऐसा कर सकता है:

import argparse 

def required_length(nmin,nmax): 
    class RequiredLength(argparse.Action): 
     def __call__(self, parser, args, values, option_string=None): 
      if not nmin<=len(values)<=nmax: 
       msg='argument "{f}" requires between {nmin} and {nmax} arguments'.format(
        f=self.dest,nmin=nmin,nmax=nmax) 
       raise argparse.ArgumentTypeError(msg) 
      setattr(args, self.dest, values) 
    return RequiredLength 

parser=argparse.ArgumentParser(prog='PROG') 
parser.add_argument('-f', nargs='+', action=required_length(2,3)) 

args=parser.parse_args('-f 1 2 3'.split()) 
print(args.f) 
# ['1', '2', '3'] 

try: 
    args=parser.parse_args('-f 1 2 3 4'.split()) 
    print(args) 
except argparse.ArgumentTypeError as err: 
    print(err) 
# argument "f" requires between 2 and 3 arguments 
+1

यहां समय यात्री। बहुत बढ़िया जवाब! हालांकि, आप यहां 'argparse.Action' subclassing कर रहे हैं ... अगर मैं अपनी कार्रवाई' संलग्न 'होना चाहता हूं तो क्या होगा? मैं इस कोड को कैसे संशोधित कर सकता हूं ताकि मैं इस तर्क के कई उदाहरण जोड़ सकूं, और उस निर्दिष्ट सीमा प्रभाव को भी प्राप्त कर सकूं? – 2rs2ts

+1

आह, वास्तव में, [इस उत्तर] के साथ अपना कोड विलय कर रहा है (http://stackoverflow.com/a/5374229/691859) जो मैंने खोजा था। मुझे कभी भी बुरा मत मानो - जब तक कि आप एक ही बात नहीं सोच रहे थे, इस मामले में, उस उत्तर को देखें। – 2rs2ts

+2

एक रेंज 'nargs' विकल्प जोड़ने के लिए एक प्रस्तावित पैच http://bugs.python.org/issue11354 है, उदा। 'nargs = (2,3)' या 'nargs = '{2,3}'' ('re' शैली नोटेशन)। यह दृष्टिकोण अधिक शक्तिशाली होता है जब अन्य पोजिशनरों में 'nargs' मान होते हैं। अन्यथा यह कस्टम एक्शन दृष्टिकोण ठीक काम करता है। – hpaulj

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