Optparse回调未消耗参数
我正在尝试更好地了解 optparse
,但是我有点搞不懂为什么下面的代码会这样运行。我是不是做错了什么?
import optparse
def store_test(option, opt_str, value, parser, args=None, kwargs=None):
print 'opt_str:', opt_str
print 'value:', value
op = optparse.OptionParser()
op.add_option('-t', '--test', action='callback', callback=store_test, default='test',
dest='test', help='test!')
(opts, args) = op.parse_args(['test.py', '-t', 'foo'])
print
print 'opts:'
print opts
print 'args:'
print args
输出:
opt_str: -t value: None opts: {'test': 'test'} args: ['foo']
为什么 'foo'
没有被传递给 store_test()
,反而被当作额外的参数处理了?op.parse_args(['-t', 'foo'])
有问题吗?
↓
http://codepad.org/vq3cvE13
编辑:
这是文档中的一个例子:
def store_value(option, opt_str, value, parser):
setattr(parser.values, option.dest, value)
[...]
parser.add_option("--foo",
action="callback", callback=store_value,
type="int", nargs=3, dest="foo")
1 个回答
6
你缺少一个“类型”选项属性:
op.add_option('-t', '--test', action='callback', callback=store_test, default='test',
dest='test', help='test!', type='str')
这个选项会让它处理下一个参数。
参考链接: http://docs.python.org/library/optparse.html#optparse-option-callbacks
类型
这个词的意思是:就像“存储”或“追加”这些操作一样,它告诉optparse去处理一个参数,并把它转换成指定的类型。不过,optparse并不会把转换后的值存储到任何地方,而是直接把它传给你的回调函数。nargs
这个词的意思也是一样:如果你提供了这个选项,并且它的值大于1,optparse会处理nargs个参数,每个参数都必须能转换成指定的类型。然后,它会把转换后的值以元组的形式传给你的回调函数。
这似乎是来自 optparse.py
的相关代码:
def takes_value(self):
return self.type is not None
def _process_short_opts(self, rargs, values):
[...]
if option.takes_value():
# Any characters left in arg? Pretend they're the
# next arg, and stop consuming characters of arg.
if i < len(arg):
rargs.insert(0, arg[i:])
stop = True
nargs = option.nargs
if len(rargs) < nargs:
if nargs == 1:
self.error(_("%s option requires an argument") % opt)
else:
self.error(_("%s option requires %d arguments")
% (opt, nargs))
elif nargs == 1:
value = rargs.pop(0)
else:
value = tuple(rargs[0:nargs])
del rargs[0:nargs]
else: # option doesn't take a value
value = None
option.process(opt, value, values, self)