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 changed the interpretation of the positional catchall parameter使这成为可能,而不强制您使用 **
关键字参数包罗万象。
如果您无法自己更改函数定义或升级到 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)
关于python - 有没有一种方法可以在Python中不指定默认值参数的情况下访问可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15551324/