编程语言
首页 > 编程语言> > python – Optparse回调不消耗参数

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’])有什么问题吗?

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")

解决方法:

您缺少“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