2011-11-08 14 views
6

は、次のではなく、標準のコードを取る:-x-fの両方が明示的に存在する場合、エラーが報告されるべきである。 Pythonの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が明示的に存在するかどうかを検出するにはどうすればよいですか?そうでない場合でも、optionsはデフォルト値を示します。

--helpがデフォルト値をうまく印刷するため、私はむしろデフォルト値を設定することを避けることをお勧めします。 -xのための複数の名前があります(つまり、--long-名前)と相互に排他的な複数のペアがあるかどう

もう一つの方法は、あまりにも、少し厄介です-xのインスタンスにsys.argvをチェックすることになりますオプション。

これには優雅なソリューションがありますか?

答えて

7

argparseを使用してください。 mutually exclusive groupsのためのセクションがあります:

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はとにかく推奨されていません。

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の場合、応答は次のようになります。

関連する問題