2012-06-12 32 views
9
class StartAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 

start.add_argument('-s', '--start', action=StartAction) 

मुझे पता है कि सामान्य रूप से कार्रवाई 'store_true' जैसी कुछ होती है, जो तर्क की आवश्यकता को रोकती है, लेकिन क्या कस्टम कार्रवाई का उपयोग करने का कोई तरीका है और अभी भी पास होने के लिए तर्क की आवश्यकता नहीं है?Argparse - कोई तर्क के साथ कस्टम कार्रवाई?

तो मैं क्या चाहते है:

python example.py -s

Hello

उत्तर

15

कोशिश अपने start.add_argument को nargs=0 जोड़ने:

start.add_argument('-s', '--start', action=StartAction, nargs=0) 
+1

वैल्यूएरर: स्टोर क्रियाओं के लिए नर्ग> 0 होना चाहिए; अगर आपके पास स्टोर करने के लिए कुछ भी नहीं है, तो स्टोर सही या स्टोर कॉस्ट जैसी गतिविधियां अधिक उपयुक्त हो सकती हैं – Lucina

+1

मैं @ लुसीना टिप्पणी से सहमत नहीं हूं। आप पार्सिंग तर्कों और जटिल कार्यों के बीच एक निर्बाध मानचित्रण करने के लिए एक कस्टम कार्रवाई को कॉल करना चाह सकते हैं। मैं एक्शन ऑब्जेक्ट्स को प्राथमिकता देता हूं जो सीएलआई के पैरामीटर के रूप में व्यवहार करते हैं, इसलिए मेरे पास सीएलआई इटरफेस और ऑब्जेक्ट जो इसे संभालता है, के बीच बहुरूपता है। – Daniel

3

mgilson suggestednargs=0 के रूप में काम कर देता है। चूंकि यह अपनी कार्रवाई के लिए आंतरिक है, मैं यह कार्रवाई अंदर डाल चाहते हैं:

class StartAction(argparse.Action): 
    def __init__(self, nargs=0, **kw): 
     super().__init__(nargs=nargs, **kw) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 

start.add_argument('-s', '--start', action=StartAction) 

और तुम हर add_argument() कॉल करने के लिए nargs=0 जोड़ने के लिए होने के अतिरेक के बिना अपने वांछित व्यवहार किया है। अगर आपके पास एक ही तरीके से काम कर रहे कई तर्क हैं तो साफ रखें।

हालांकि उपयोगकर्ता अभी भी nargs=0 के डिफ़ॉल्ट को ओवरराइड कर सकते हैं जो प्रश्न में प्रदर्शित आपके उपयोग के मामले के लिए मूर्ख है। इसलिए मैं इसे लागू करता हूं:

class StartAction(argparse.Action): 
    def __init__(self, nargs=0, **kw): 
     if nargs != 0: 
      raise ValueError('nargs for StartAction must be 0; it is ' 
          'just a flag.') 
     super().__init__(nargs=nargs, **kw) 
    def __call__(self, parser, namespace, values, option_string=None): 
     print "Hello" 
संबंधित मुद्दे