有没有一种方法可以在不指定Python中的默认值参数的情况下访问varargs
有没有一种方法可以调用有没有一种方法可以在不指定Python中的默认值参数的情况下访问varargs,python,python-2.7,arguments,argument-passing,Python,Python 2.7,Arguments,Argument Passing,有没有一种方法可以调用foo,在函数调用中指定*args而不指定a或b,从而使用默认值 差不多 def foo(a=MyComplexObject(), b=Something(), *args): print a, b, args 这纯粹是出于好奇。您还必须将关键字参数移动到变量关键字捕获: foo(*args=(1,2,3)) Python将首先填充这两个关键字参数,否则,在Python2中,无法指定这些关键字不能由位置参数填充 Python 3使这成为可能,而无需强制使用**关
foo
,在函数调用中指定*args而不指定a或b,从而使用默认值
差不多
def foo(a=MyComplexObject(), b=Something(), *args):
print a, b, args
这纯粹是出于好奇。您还必须将关键字参数移动到变量关键字捕获:
foo(*args=(1,2,3))
Python将首先填充这两个关键字参数,否则,在Python2中,无法指定这些关键字不能由位置参数填充
Python 3使这成为可能,而无需强制使用**
关键字参数catch all
如果您不能自己更改函数定义或升级到Python 3,那么您唯一的办法就是再次指定默认值,或从函数中检索它们(使用):
defaults
这里是关键字参数默认值的元组
演示:
import inspect
defaults = inspect.getargspec(foo).defaults
foo(*(defaults + (1,2,3)))
没有回答我的问题。我无法更改函数签名或函数内部的内容。@mkorpela:这就是您必须执行的操作方式。@mkorpela然后您必须执行:`foo(MyComplexObject(),Something(),*(1,2,3)),我没有访问默认值的权限。IIRC,在本例中,
a
&b
仅实例化一次,因此它与default\u a=MyComplexObject()
,def foo(a=default\u a):
;在Python2.7中,args也位于kwargs之前。
import inspect
defaults = inspect.getargspec(foo).defaults
foo(*(defaults + (1,2,3)))
>>> 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)