2012-11-27 13 views
5

वर्तमान में, मैं तर्कों का विश्लेषण करने और बूलियन विकल्पों के रूप में फ़्लैग स्टोर करने के लिए argparse का उपयोग कर रहा हूं। मैं फिर यह देखने के लिए जांचता हूं कि कौन सा झंडा सत्य पर सेट है और उस फ़ंक्शन को निष्पादित करता है। Argparse एक इनपुट फ़ाइल का विश्लेषण करता है, जिसे खोला जाता है और बुलाए गए फ़ंक्शन को तर्क के रूप में पास किया जाता है।argparse अन्य विकल्पों को पार्स करने के बाद एक फ़ंक्शन को कॉल करें

तो:

parser.add_argument('input_data', action='store', help='some help') 
parser.add_argument('outputname', action='store',default=None, help='some help') 
parser.add_argument('--flag','-f', action='store_true', dest='flag', default=False, help='help!') 

मैं input_data खोलने के लिए यह से कुछ जानकारी को पढ़ने के लिए झंडा समारोह कहा जाता है से पहले की है। यह वर्तमान में कार्यान्वित किया जाता है के रूप में:

if args.flag == True: 
    array_out = flag(array_read_from_input) 
    if args.outputname == None: 
     name = 'Flag.tif' 

यह कार्रवाई कीवर्ड एक समारोह कॉल करने के लिए subclass argparse करना संभव है।

क्या इनपुट_डाटा विकल्प को पार्स करना संभव है, कुछ प्रोसेसिंग करें, और फिर प्रत्येक तर्क के लिए लूप, उदाहरण के लिए ध्वज फ़ंक्शन को कॉल करें, उदाहरण के लिए, Argparse के एक्शन पैरामीटर को उपclassing द्वारा?

+0

वस्तुओं को 'सही' या 'कोई नहीं' से तुलना न करें। या तो 'is' का उपयोग करें या ऑब्जेक्ट की सत्यता का उपयोग करें (इस प्रकार यह होना चाहिए' अगर args.flag: ... 'और' अगर args.outputname कोई नहीं है ')। साथ ही, आप जानते हैं कि आप कस्टम क्रियाएं सही बना सकते हैं? बस Argparse दस्तावेज पढ़ें। – Bakuriu

+0

@ बाकुरीयू "एक्शन कीवर्ड को फ़ंक्शन कॉल करने के लिए Argparse को उपclass करना संभव है।" सवाल यह नहीं है कि कस्टम कार्रवाई करना संभव है, लेकिन क्या अन्य तर्कों को पार्स करने और छेड़छाड़ करने के बाद उस क्रिया को बुलाया जा सकता है। – Jzl5325

+0

यदि आप इसे * पार्सिंग के बाद * कॉल करना चाहते हैं, तो मुझे समझ में नहीं आता कि आपके प्रश्न के लिए 'argparse' का रिश्ता क्या है। वह मॉड्यूल केवल कमांड लाइन को पार्स करने के लिए है और अंत में * पार्सिंग के दौरान क्रियाएं निष्पादित करता है। साथ ही, मुझे समझ में नहीं आता कि डबल 'if' के साथ क्या गलत है। एक साइड नोट के रूप में: कुछ भी आपको [पार्सर] (http://docs.python.org/dev/library/argparse.html#argumentparser-objects) के उप-वर्ग का उपयोग करने के लिए प्रतिबंधित नहीं करता है और 'parse_args' को फिर से कार्यान्वित करता है ताकि फ़ंक्शन वहां कहा जाता है, लेकिन आपको अभी भी डबल 'if' रखना होगा। – Bakuriu

उत्तर

0

यह नेस्ट बिना input_data विकल्प पार्स करने के लिए, कुछ प्रसंस्करण प्रदर्शन, और फिर फोन झंडा समारोह संभव है यदि प्रत्येक तर्क, उदा।, Argparse की कार्रवाई पैरामीटर उपवर्गीकरण द्वारा लिए छोरों?

आपके प्रश्न के अनुसार;

class FooAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     << some processing of values >> 
     array_out = flag(values) 
     setattr(namespace, self.dest, array_out) 

parser = argparse.ArgumentParser() 
parser.add_argument('input_data', action=FooAction, help='some help') 
संबंधित मुद्दे