दिलचस्प पोस्ट
स्रोत और वितरकों की भूमिका क्या है? AngularJs में एक वैश्विक HTTP टाइमआउट कैसे सेट करें .NET में संसाधनों का निर्माण और उपयोग कैसे करें EAGLView से UIImage कैसे प्राप्त करें? आगे का उपयोग करने के फायदे मैं "होम" पृष्ठ पर नियंत्रक नाम को छिपाने के लिए asp.net mvc रूटिंग को कैसे कॉन्फ़िगर करूं? मैं बाह्य सीएसएस के साथ इनलाइन शैलियों को ओवरराइड कैसे कर सकता हूं? एललिस्टिकशैर्क में "विश्लेषण नहीं किया गया" स्ट्रिंग का डिफ़ॉल्ट मैपिंग बदलें स्विफ्ट में हर एक्स मिनट कुछ करो स्ट्रिंगिफिकेशन – यह कैसे काम करता है? डॉकर में पर्यवेक्षक का उपयोग Chrome.tabs.executeScript () का उपयोग करके इंजेक्ट किए गए सामग्री स्क्रिप्ट में पैरामीटर पास करें Backbone.js model.get () वापस 'अपरिभाषित' भले ही मैं कंसोल .log में विशेषता देख सकता हूं पाठ से भाषण (टीटीएस) – Android मुझे std :: thread :: detach का उपयोग कब करना चाहिए?

Argparse: यदि 'एक्स' मौजूद है तो आवश्यक तर्क 'वाई'

मेरे पास निम्नानुसार आवश्यकता है:

./xyifier --prox --lport lport --rport rport 

तर्क prox के लिए, मैं कार्रवाई = 'store_true' का उपयोग करके जांचने के लिए कि यह मौजूद है या नहीं मुझे किसी भी तर्क की आवश्यकता नहीं है I लेकिन, अगर –prox सेट होता है तो मुझे रपोर्ट और लपोर्ट की आवश्यकता होती है I कस्टम सशर्त कोडन लिखने के बिना ऐसा करने का एक आसान तरीका है।

अधिक कोड:

 non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy') non_int.add_argument('--lport', type=int, help='Listen Port.') non_int.add_argument('--rport', type=int, help='Proxy port.') 

Solutions Collecting From Web of "Argparse: यदि 'एक्स' मौजूद है तो आवश्यक तर्क 'वाई'"

नहीं, विकल्पों में से पारस्परिक रूप से समावेशी सेट बनाने के लिए Argparse में कोई विकल्प नहीं है।

इस से निपटने का सबसे सरल तरीका होगा:

 if args.prox and args.lport is None and args.rport is None: parser.error("--prox requires --lport and --rport.") 

आप सशर्त अपेक्षित तर्क होने के बारे में बात कर रहे हैं। @ जॉर्टीपिंग की तरह आप त्रुटि की जांच कर सकते हैं और parser.error() कर सकते हैं। parser.error() , या आप एक नया तर्क जोड़ते समय --prox से संबंधित आवश्यकता को लागू कर सकते हैं।

आपके उदाहरण के लिए एक सरल उपाय हो सकता है:

 non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy') non_int.add_argument('--lport', required='--prox' in sys.argv, type=int) non_int.add_argument('--rport', required='--prox' in sys.argv, type=int) 

इस तरह की required को या तो True या False प्राप्त होता है, इस पर निर्भर करता है कि उपयोगकर्ता के रूप में प्रयुक्त --prox यह भी गारंटी देता है कि -lport और -rport का एक-दूसरे के बीच एक स्वतंत्र व्यवहार होता है

जब आप lport सेट नहीं करते हैं तो क्या आप उपयोग करते हैं। यदि नहीं, तो क्यों नहीं lport और rport prox ? जैसे

 parser.add_argument('--prox', nargs=2, type=int, help='Prox: listen and proxy ports') 

जो आपके उपयोगकर्ता टाइपिंग को बचाता है। यह तय करना आसान है कि if args.prox is not None: जैसे if args.prox: :।

parser.parse_known_args() विधि का उपयोग करने के बारे में और उसके बाद --lport मौजूद होने पर --lport और --rport args को आवश्यक --rport रूप में --prox है।

 # just add --prox arg now non_int = argparse.ArgumentParser(description="stackoverflow question", usage="%(prog)s [-h] [--prox --lport port --rport port]") non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy, requires additional args lport and rport') opts, rem_args = non_int.parse_known_args() if opts.prox: non_int.add_argument('--lport', required=True, type=int, help='Listen Port.') non_int.add_argument('--rport', required=True, type=int, help='Proxy port.') # use options and namespace from first parsing non_int.parse_args(rem_args, namespace = opts) 

यह भी ध्यान में रखें कि आप दूसरी बार शेष तर्कों को पार्स करते समय पहले पार्सिंग के बाद उत्पन्न नामस्थान opts आपूर्ति कर सकते हैं। इस तरह, अंत में, सभी पार्सिंग के बाद, आपके पास सभी विकल्पों के साथ एक सिंगल नेमस्पेस होगा

कमियां:

  • यदि --prox मौजूद नहीं है तो अन्य दो निर्भर विकल्प नामस्थान में मौजूद नहीं हैं। हालांकि आपके उपयोग-मामले के आधार पर, यदि --prox मौजूद नहीं है, तो अन्य विकल्पों के साथ क्या होता है जो अप्रासंगिक है
  • उपयोग संदेश को संशोधित करने की आवश्यकता है क्योंकि पार्सर पूरी संरचना को नहीं जानता है
  • --lport और --rport मदद संदेश में दिखाई नहीं देता