我试图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
Run Code Online (Sandbox Code Playgroud)
输出:
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")
Run Code Online (Sandbox Code Playgroud)
您缺少"type" 或"nargs"选项属性:
op.add_option('-t', '--test', action='callback', callback=store_test, default='test',
dest='test', help='test!', type='str')
Run Code Online (Sandbox Code Playgroud)
此选项将使其使用下一个参数.
参考:http: //docs.python.org/library/optparse.html#optparse-option-callbacks
type
有其通常的含义:与"store"或"append"操作一样,它指示optparse使用一个参数并将其转换为type.但是,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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3036 次 |
| 最近记录: |