def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
有没有办法通过指定* args和而不是在函数调用中指定a或b来调用foo
- 从而使用默认值?
像
这样的东西foo(*args=(1,2,3))
纯粹是出于好奇。
答案 0 :(得分:3)
您还必须将关键字参数移动到变量关键字捕获:
def foo(*args, **kw):
a = kw.get('a', MyComplexObject())
b = kw.get('b', b=Something())
print a, b, args
Python将填充两个关键字参数 first ,否则就像在Python 2中一样,无法指定这些关键字不能通过位置参数填充。
Python 3 changed the interpretation of the positional catchall parameter使这成为可能,而不必强迫您使用**
关键字参数catch-all。
如果您无法自行更改功能定义或升级到Python 3,那么您唯一的办法是再次指定默认值,或从函数中检索它们(使用inspect.getargspec()
convenience function):
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)