6

次のかなり標準的なコードを取ります。

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、デフォルト値をリストしてください。

1つの方法は、デフォルト値を適切に出力するため、デフォルト値を設定しないようにすること--helpです。

もう1つの方法は、の名前が複数あり(つまり、-long-name)、相互に排他的なオプションのペアが複数ある場合に、少し厄介なsys.argvインスタンスをチェックすることです。-x-x

これに対するエレガントな解決策はありますか?

4

2 に答える 2

9

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、応答は次のとおりです。

使用法:op.py[オプション]

op.py:エラー:オプション-xと-fは相互に排他的です

于 2011-11-08T05:29:08.300 に答える
8

argparseを使用します。相互に排他的なグループのセクションがあります:

argparse.add_mutually_exclusive_group(required = False)

相互に排他的なグループを作成します。argparseは、相互に排他的なグループの引数の1つだけがコマンドラインに存在することを確認します。

>>> 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はとにかく非推奨です。

于 2011-11-08T05:18:09.137 に答える