我认为正确的方法是以某种方式“定义您的操作”。
例如,您可以使用动作{{link1:callback
}}并实现一个函数来实现所需的行为。
您可以编写一个函数,首先检查目标是否已经填充,如果已经填充,则将重叠选项存储到列表中。
解析完成后,应检查这些列表是否为空,如果不为空,则引发适当的异常。
另一种方法是定义自己的操作。您可以在此处查看。
使用回调的小例子:
import sys
import functools
from optparse import OptionParser
bad_option = 'BAD OPTION'
def store(option, opt, value, parser, dest, val):
"""Set option's destination *dest* to *val* if there are no conflicting options."""
list_name = dest + '_options_list'
try:
getattr(parser.values, list_name).append(opt)
setattr(parser.values, dest, bad_option)
except AttributeError:
setattr(parser.values, dest, val)
setattr(parser.values, list_name, [opt])
store_true = functools.partial(store, val=True)
store_false = functools.partial(store, val=False)
parser = OptionParser()
parser.add_option('-v', '--verbose',
action='callback', callback=store_true,
help='Increase output verbosity',
callback_kwargs={'dest': 'verbose'})
parser.add_option('-q', '--quiet',
action='callback', callback=store_false,
help='Decrease output verbosity',
callback_kwargs={'dest': 'verbose'})
opts, args = parser.parse_args()
found = False
for dest in ('verbose',):
if getattr(opts, dest) == bad_option:
conflicting_opts = ', '.join(getattr(opts, dest + '_options_list'))
print('Conflicting options %s for destination %s'
% (conflicting_opts, dest))
found = True
if found:
parser.print_usage()
sys.exit(2)
并输出:
$ python testing_optparse.py -v -q
Conflicting options -v, -q for destination verbose
Usage: prova_optparse.py [options]
也许在检测到冲突时引发一个OptionValueError
会更好,即使这样只能获取几个冲突选项。如果您想获取所有冲突的选项,则必须解析剩余的参数(在parser.rargs
中)。
argparse
可在 Python 2.3 及更高版本上使用。 - Martijn Pieters