2
def foo(a=MyComplexObject(), b=Something(), *args):
    print a, b, args

有没有办法在函数调用中foo指定 *args 而不是指定 a 或 b 来调用 - 从而使用默认值?

就像是

foo(*args=(1,2,3))

这纯粹是出于好奇。

4

1 回答 1

3

您还必须将关键字参数移动到变量关键字捕获中:

def foo(*args, **kw):
    a = kw.get('a', MyComplexObject())
    b = kw.get('b', b=Something())
    print a, b, args

否则 Python 将首先填充两个关键字参数,因为在 Python 2 中无法指定这些关键字不能由位置参数填充。

Python 3更改了位置 catchall 参数的解释,使这成为可能,而不会强制您使用**关键字参数 catch-all。

如果您不能自己更改函数定义或升级到 Python 3,那么您唯一的办法是再次指定默认值,或者从函数中检索它们(使用inspect.getargspec()便捷函数):

import inspect

defaults = inspect.getargspec(foo).defaults
foo(*(defaults + (1,2,3)))

defaults这是关键字参数默认值的元组。

示范:

>>> import inspect
>>> def foo(a='spam', b='foo', *args):
...     print a, b, args
... 
>>> defaults = inspect.getargspec(foo).defaults
>>> foo(*(defaults + (1,2,3)))
spam foo (1, 2, 3)
于 2013-03-21T15:16:36.410 回答