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也要列出默认值。

一种方法是避免设置我宁愿不做的默认值,因为--help可以很好地打印默认值。

另一种方法是检查也有点尴尬sys.argv的实例-x,如果有多个名称-x(即 --long-name)并且有多个互斥选项。

有一个优雅的解决方案吗?

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 将确保互斥组中只有一个参数出现在命令行上:

>>> 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 回答