2011-11-08 14 views
6

aşağıdaki ziyade standart kodu atın: -x ve -f hem açıkça mevcut olduğunda, bir hata rapor edilmelidir: Python optparse, varsayılan değerler ve açık seçenekler

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 ve -f birbirini dışlayan olduğunu varsayalım.

-x'un açık olup olmadığını nasıl anlarım? Olmasa bile, options varsayılan değeri listeler.

--help varsayılan değerleri güzel şekilde yazdırdığı için yapmamayı tercih ettiğim varsayılan değeri belirlemekten kaçınmanın bir yolu olacaktır.

bir başka yolu -x (yani, bir --long-adıdır) için birden fazla isim var ve birbirini dışlayan birden fazla çifti varsa da biraz garip -x örnekleri için sys.argv kontrol olacaktır

seçenekler.

Bunun için şık bir çözüm var mı?

cevap

7

argparse'u kullanın.

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 zaten itiraz edildi: mutually exclusive groups için bir bölüm var.

8

Bunu bir geri bildirim kullanarak optparse ile yapabilirsiniz. kodunuzdan Bina:

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') 

şimdilik bu senaryoyu op.py diyelim. python op.py -x 1 -f yaparsam, yanıt şöyledir:

Usage: op.py [options]

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

İlgili konular