2012-12-17 11 views
14

मैं argparse में इस तरह तर्क लागू करने के लिए करना चाहते हैं:अजगर argparse: कुछ संगत तर्क के साथ पारस्परिक रूप से विशिष्ट समूह

If argument A is selected, the user cannot select arguments B or C. 
B and C can both be selected 

यह add_mutually_exclusive_group की तरह लग रहा है क्या मैं इस के लिए चाहते हो जाएगा, लेकिन यह लगता है कि आप केवल कर सकते हैं परस्पर अनन्य समूह से एक विकल्प चुनें, इसलिए मैं तीनों को पारस्परिक रूप से अनन्य समूह में नहीं डाल सकता।

क्या Argparse में ऐसा करने का कोई तरीका है?

+0

क्या आप बस अगर किसी के साथ Argparse के बाद जांच कर रहे थे? – erikbwork

+2

मैं कर सकता था, Argparse के बारे में अच्छी बात यह है कि यह आपके लिए त्रुटि संदेश संभालती है। –

+0

हालांकि मैं परस्पर अनन्य समूह में 'add_argument_group' का उपयोग करके विकल्पों का एक सामान्य समूह जोड़ सकता हूं, लेकिन यह बिल्कुल काम नहीं करता है (यह बिल्कुल परस्पर अनन्य समूह नहीं है)। शायद आपके पास बेहतर विकल्प है जो एक कस्टम एक्शन लिखना है जो इस तरह के तर्क को लागू करता है। यह करना बहुत मुश्किल होना चाहिए। – Bakuriu

उत्तर

-1

आप ए के अर्थ को अस्वीकार कर सकते हैं और फिर उपपरक्षक का उपयोग कर सकते हैं। उप-पाठक आपको यह निर्दिष्ट करने की अनुमति देते हैं कि "यदि और केवल अगर कोई चुना गया है, तो उपयोगकर्ता बी या सी का चयन कर सकता है"

http://docs.python.org/2/library/argparse.html

+3

उदाहरण के बिना यह वास्तव में एक बुरा जवाब है। – Oz123

2

आप वास्तव में argparse साथ ऐसा नहीं कर सकता है, लेकिन आप यह कर सकते के बाद argparse समाप्त हो गया है।

parser = argparse.ArgumentParser() 

# group 1 
parser.add_argument("-q", "--query", help="query", required=False) 
parser.add_argument("-f", "--fields", help="field names", required=False) 

# group 2 
parser.add_argument("-a", "--aggregation", help="aggregation", 
        required=False) 

मैं यहाँ एक MongoDB क्वेरी करने के लिए एक कमांड लाइन आवरण के लिए दिए गए विकल्पों का उपयोग कर रहा:

यहाँ एक उदाहरण है। collection उदाहरण वैकल्पिक तर्क query और और fields के साथ विधि aggregate या विधि find विधि को कॉल कर सकता है, इसलिए आप देखते हैं कि पहले दो तर्क संगत क्यों हैं और अंतिम नहीं है।

तो अब मैं parser.parse_args() चलाने के लिए और जाँच यह सामग्री है:

args = parser().parse_args() 

print args.aggregation 
if args.aggregation and (args.query or args.fields): 
    print "-a and -q|-f are mutually exclusive ..." 
    sys.exit(2) 
बेशक

, इस छोटे से हैक केवल साधारण मामलों के लिए काम कर रहा है और यह सब संभव विकल्पों की जांच करने के लिए आप कई परस्पर अगर एक बुरा सपना बन जाएगा विशेष विकल्प और समूह। उस स्थिति में आपको कमांड समूहों में अपने विकल्प तोड़ना चाहिए। इसके लिए, आपको Python argparse mutual exclusive group पर सुझाव का पालन करना चाहिए।

1

Docopt इस उदाहरण में काम कर सकता है।

यह परस्पर अनन्य तत्वों के लिए पाइप का उपयोग करता है।

my_program (aggregate | find [-q | -f]) 
+0

यदि आपको अपनी टीम के साथ स्थिरता के लिए argparse का उपयोग नहीं करना है, तो डॉकॉप का उपयोग करें। यदि आपको Argparse का उपयोग करना है, तो उस व्यक्ति से बात करें जो अलग-अलग निर्णय ले सकता है, और उन्हें डॉकॉप दिखा सकता है। डॉकॉप इसे जटिल और जटिल जटिलताओं और व्यवहारों को स्थापित करने में बहुत आसान बनाता है, क्योंकि तर्क और यह वास्तव में कुत्ते को कुचलने वाली पूंछ है। मुझे एक ऐसा उदाहरण नहीं मिला है जहां मैं वास्तव में डॉकोपेट में कुछ ऐसा नहीं कर सका, जिसे मैं कर सकता था (और काम करेगा)। – TinBane

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