def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
有没有办法在函数调用中foo
指定 *args 而不是指定 a 或 b 来调用 - 从而使用默认值?
就像是
foo(*args=(1,2,3))
这纯粹是出于好奇。
def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
有没有办法在函数调用中foo
指定 *args 而不是指定 a 或 b 来调用 - 从而使用默认值?
就像是
foo(*args=(1,2,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)