有没有办法在不指定Python中的默认值参数的情况下访问varargs

时间:2013-03-21 15:13:26

标签: python python-2.7 arguments argument-passing

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

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

这样的东西
foo(*args=(1,2,3))

纯粹是出于好奇。

1 个答案:

答案 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)