gpt4 book ai didi

python - Optparse 回调不使用参数

转载 作者:太空狗 更新时间:2023-10-30 01:03:37 24 4
gpt4 key购买 nike

我试图更好地了解 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: -tvalue: Noneopts:{'test': 'test'}args:['foo']

Why is 'foo' not being passed to store_test() and instead being interpreted as an extra argument? Is there something wrong with op.parse_args(['-t', 'foo'])?

http://codepad.org/vq3cvE13

Edit:

Here's the example from the docs:

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 回调不使用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6583963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com