首页 > 解决方案 > 如何在带有 *args 和 **kwargs 的函数调用中使用默认参数?

问题描述

我有以下简单的示例代码:

def wrapper(foo, para1=1, *args):
    print("para1: "+ str(para1))
    print(foo(*args))

def foo1(x):
    return 2*x

wrapper(foo1, 2, 3)

我在其中定义了一个函数,该函数wrapper具有一个para1带有默认值的参数1

但是为了foo1正确调用带有函数的包装器,我必须一直设置para1,因为我必须将额外的参数传递给foo1. 这意味着默认值para1=1没有任何意义,因为无论如何我必须一直定义它。

或者是否有其他方法来定义函数,这样我就可以轻松使用这个默认值,而不必一直定义它?

例如,

wrapper(foo1, *args=(3,))
wrapper(foo=foo1, args=(3,))

不工作...

用例示例:

def wrapper(foo, timeout=10, *args):
    time0 = time.time()
    while time0 < time.time() + timeout:
        if foo(*args):
             return True
        time.sleep(1)
    raise SomeTimeout Exception

标签: pythonfunctiondefault

解决方案


怎么弄成这样?

#/usr/bin/env python3

def f1(f, *args, **kwargs):
    if not 'b' in kwargs:
        kwargs['b'] = 1
    print('b =',kwargs['b'])
    f(args)

def fx(args):
    print(args)

f1(fx, 3, 4)
print()
f1(fx, 3, 4, b=2)

输出:

b = 1                                                                     
(3, 4)

b = 2                                                                     
(3, 4)

推荐阅读