2011-11-08 15 views
6

निम्नलिखित बल्कि मानक कोड डालें:अजगर optparse, मूलभूत मूल्यों, और स्पष्ट विकल्प

from optparse import OptionParser       
opts = OptionParser() 
opts.add_option('-f', action="store_true") 
opts.add_option("-x", dest="x", type="int", default=1) 
options, args = opts.parse_args() 

मान लें कि -x और -f परस्पर अनन्य हैं: जब -x और -f दोनों स्पष्ट रूप से मौजूद हैं, एक त्रुटि सूचित किया जाना चाहिए।

मैं कैसे पता लगा सकता हूं कि -x स्पष्ट रूप से मौजूद है या नहीं? भले ही यह नहीं है, options डिफ़ॉल्ट मान सूचीबद्ध करें।

एक तरीका डिफ़ॉल्ट मूल्य निर्धारित करने से बचने के लिए होगा जो मैं नहीं करूंगा क्योंकि --help डिफ़ॉल्ट मानों को अच्छी तरह प्रिंट करता है।

एक और तरीका है -x की घटनाओं के लिए sys.argv जो थोड़ा अजीब है, भी है, वहाँ -x (अर्थात, एक --long-नाम) के लिए एक से अधिक नाम है और वहाँ परस्पर अनन्य के एक से अधिक जोड़ी अगर जाँच की जाएगी विकल्प।

इसके लिए यह एक सुरुचिपूर्ण समाधान है?

उत्तर

7

argparse का उपयोग करें।

argparse.add_mutually_exclusive_group(required=False)

Create a mutually exclusive group. argparse will make sure that only one of the arguments in the mutually exclusive group was present on the command line:

>>> parser = argparse.ArgumentParser(prog='PROG') 
>>> group = parser.add_mutually_exclusive_group() 
>>> group.add_argument('--foo', action='store_true') 
>>> group.add_argument('--bar', action='store_false') 
>>> parser.parse_args(['--foo']) 
Namespace(bar=True, foo=True) 
>>> parser.parse_args(['--bar']) 
Namespace(bar=False, foo=False) 
>>> parser.parse_args(['--foo', '--bar']) 
usage: PROG [-h] [--foo | --bar] 
PROG: error: argument --bar: not allowed with argument --foo 

optparse वैसे भी हटा दिया गया है: वहाँ mutually exclusive groups के लिए एक अनुभाग है।

8

आप इसे कॉलबैक का उपयोग करके optparse के साथ पूरा कर सकते हैं। अपने कोड से निर्माण:

from optparse import OptionParser 

def set_x(option, opt, value, parser): 
    parser.values.x = value 
    parser.values.x_set_explicitly = True 

opts = OptionParser() 
opts.add_option('-f', action="store_true") 
opts.add_option("-x", dest="x", type="int", default=1, action='callback', 
       callback=set_x) 
options, args = opts.parse_args() 
opts.values.ensure_value('x_set_explicitly', False) 

if options.x_set_explicitly and options.f: 
    opts.error('options -x and -f are mutually exclusive') 

चलिए अभी के लिए इस स्क्रिप्ट op.py कहते हैं। अगर मैं python op.py -x 1 -f करता हूं, तो प्रतिक्रिया है:

Usage: op.py [options]

op.py: error: options -x and -f are mutually exclusive

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