python – 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’])有什么问题吗?
↓
编辑:
以下是文档中的示例:
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")
解决方法:
您缺少“type”或“nargs”选项属性:
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
type
has its usual meaning: as with the “store” or “append” actions, it instructs optparse
to consume one argument and convert it to type. Rather than storing the converted
value(s) anywhere, though, optparse passes it to your callback function.nargs
also has its usual meaning: if it is supplied and > 1, optparse will consume nargs
arguments, each of which must be convertible to type. It then passes a tuple of converted
values to your callback.
这似乎是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)
标签:python,optparse 来源: https://codeday.me/bug/20190518/1127736.html