2013-04-07 6 views
5

मुझे पता है कि एक परस्पर अनन्य समूह में एकाधिक स्थितित्मक तर्कों को समझ में नहीं आता है क्योंकि आप यह नहीं कह सकते कि कौन है। लेकिन मुझे उसमें एक स्थितित्मक तर्क शामिल करने की आवश्यकता है।Argparse परस्पर अनन्य समूह में एक स्थितित्मक तर्क कैसे शामिल करें?

मैं क्या जरूरत है:

$ myprogram -h 
usage: myprogram [-h] [--delete value | --update value | value] 

कहाँ स्थितीय value डिफ़ॉल्ट क्रिया ("--include" की तरह) है। (तर्क के बिना myprogram भी वैध होना चाहिए)।

मेरा पहला प्रयास (यह काम करता है नहीं करता है):

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', metavar='value') 
group.add_argument('--update', metavar='value') 
group.add_argument('value') 

कि संभव है?


दूसरा प्रयास:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', action='store_true') 
group.add_argument('--update', action='store_true') 
group.add_argument('--insert', action='store_true', default=True) 
group.add_argument('value') 

उत्तर

8

मैं थोड़ा अलग ढंग से ऐसा करने चाहते हैं:

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.set_defaults(mode='insert') 
group.add_argument('--delete', action='store_const', dest='mode', const='delete') 
group.add_argument('--update', action='store_const', dest='mode', const='update') 
group.add_argument('--insert', action='store_const', dest='mode', const='insert') 
parser.add_argument('value', nargs='?') 
args = parser.parse_args() 

आप अतिरिक्त program --delete (कोई value विकल्प के साथ) करने में विफल, जोड़ने

if args.mode != 'insert' and args.value: 
    parser.error("can't {} without a value argument".format(args.mode)) 

ध्यान दें कि यह मतलब है कि चाहते हैं program --insert (value के साथ) अभी भी काम करता है। आप mode होने के बाद args.mode is not None के साथ ऊपर की जांच कर, और फिर if args.mode is None: args.mode = 'insert' या इसी तरह के कर कर, थोड़ा और प्रयास करके इससे बच सकते हैं।

+0

+1 अच्छा दृष्टिकोण – msw

3

आपका वाक्य रचना अधिक स्पष्ट रूप से वर्णन किया गया है के रूप में:

myprogram {--insert|--update|--delete} value 

जहां यह सच है और मूल्य के लिए --insert चूक की आवश्यकता है।

argparse आप अपने वांछित वाक्य रचना की तरह महसूस अपने मॉडल फिट होगा

if args.insert and (args.update or args.delete): 
    parser.print_help() 

जब कुछ की तरह और अधिक स्पष्ट है बना सकते हैं।

जवाब में जोड़ा गया टिप्पणी करने के लिए:

यहाँ छद्म कोड (जिसका अर्थ है कि मैं यह परीक्षण नहीं किया है) से पता चलता है जो मैं यह कैसे लागू करेगा जाता है:

parser.add_argument('--insert', action='store_true') 
parser.add_argument('--update', action='store_true') 
parser.add_argument('--delete', action='store_true') 
parser.add_argument('value') 
args = parser.parse_args(sys.argv) 
if ((args.insert and args.delete) or 
    (args.insert and args.update) or 
    (args.update and args.delete)): 
    # can't pick more than one, complain and quit 
elif not (args.update or args.delete): 
    # they specified no action so assume insert 
    args.insert = True 

# now one and only one of insert/update/delete is 
# True and args.value contains the argument 

मुझे आशा है कि चीजें बनाता है अधिक स्पष्ट।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मैं पूरी तरह से आप समझ में नहीं आया: मैं जोड़ने की थी ' --insert 'तर्क और सही पर डिफ़ॉल्ट डाल दिया। तो, यह हिस्सा काम किया।लेकिन तर्क के बिना 'myprogram' को कॉल करना विफल रहता है क्योंकि' मान' की आवश्यकता होती है। हो सकता है कि मैं आपको बिल्कुल समझ में नहीं आया ... – borges

+0

कृपया अपने प्रश्न को नए कोड के साथ अपडेट करें या एक नया प्रश्न खोलें क्योंकि मैं नहीं पढ़ सकता जो मैं नहीं देख सकता। मुझे संदेह है कि आपने mutual_exclusive_group को रखने की कोशिश की है जिसकी आवश्यकता नहीं है। – msw

+0

मैंने प्रश्न अपडेट किया। – borges

3

स्थितीय तर्क वैकल्पिक बनाएं

parser = ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument('--delete', metavar='value') 
group.add_argument('--update', metavar='value') 
group.add_argument('value', nargs='?') 

उपयोग तो है (के साथ '?'):

usage: ipython [-h] [--delete value | --update value | value] 
संबंधित मुद्दे