"如何在Python中不指定默认值参数而访问varargs'

2024-10-02 12:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有没有办法调用foo,在函数调用中指定*args而不是指定a或b,从而使用默认值?你知道吗

像这样的

foo(*args=(1,2,3))

这纯粹是出于好奇。你知道吗


Tags: foodefargssomethingprint函数调用办法mycomplexobject
1条回答
网友
1楼 · 发布于 2024-10-02 12:28:51

您还必须将关键字参数移动到变量关键字捕获:

def foo(*args, **kw):
    a = kw.get('a', MyComplexObject())
    b = kw.get('b', b=Something())
    print a, b, args

Python将首先填充两个关键字参数first,否则,在python2中,无法指定这些关键字不能由位置参数填充。你知道吗

python3changed the interpretation of the positional catchall parameter使之成为可能,而不必强制使用**关键字参数catch all。你知道吗

如果您不能自己更改函数定义或升级到python3,那么您唯一的办法就是再次指定默认值,或从函数中检索它们(使用^{} 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)

相关问题 更多 >

    热门问题