Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在带有*args和**kwargs的函数调用中使用默认参数?_Python_Function_Default - Fatal编程技术网

Python 如何在带有*args和**kwargs的函数调用中使用默认参数?

Python 如何在带有*args和**kwargs的函数调用中使用默认参数?,python,function,default,Python,Function,Default,我有以下简单的示例代码: def wrapper(foo, para1=1, *args): print("para1: "+ str(para1)) print(foo(*args)) def foo1(x): return 2*x wrapper(foo1, 2, 3) 其中我定义了一个函数包装器,它有一个参数para1,默认值为1 但是为了正确调用带有函数foo1的包装器,我必须始终设置para1,因为我必须将额外的参数传递给foo1。这意味着默认值para1

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

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

def foo1(x):
    return 2*x

wrapper(foo1, 2, 3)
其中我定义了一个函数
包装器
,它有一个参数
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
def包装(foo,timeout=10,*args):
time0=time.time()
当time0
您以接受数字的方式定义了
foo1
函数,但尝试在
wrapper
函数中向其传递一个元组。 以下方面应起作用:

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



def foo1(*x):
    return 2*x


wrapper(foo1, (2, 3))

foo1
x
的定义中,更改为
*x

编辑:,因为您现在已经明确它是用于Python 2的,
def包装器(foo,*args,timeout=10)
会给您一个语法错误。因此,请使用下面的方法

仅凭
*args
,我认为这不太可行。如果可能,尝试使用
**kwargs

def wrapper(foo, *args, **kwargs):
    time0 = time.time()
    # define a default timeout period if not explicitly passed in by keyword
    timeout = kwargs.get('timeout') if 'timeout' in kwargs else 10
    while time0 < time.time() + timeout:
        if foo(*args):
            return True
        time.sleep(1)
    raise SomeTimeOut Exception
:
这样做怎么样

#/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)

是否可以将
para1
放在
wrapper
args的末尾?不,然后我会得到一个语法error@Jean-FrançoisFabre然后调用
wrapper(foo1,2,3)
将再次破坏
def wrapper(foo,*args,para1=1)
?@Idlehands,它工作了!也许,这个错误来自其他地方,但事实并非如此。你真的测试过吗<代码>语法错误:引发的语法无效
。具体来说,
*args=…
是错误的来源。@Idlehands,是的,我有!我用最新编辑的完整代码更新了我的答案,你用OP回到了原点。如果你想在没有
para1
的情况下调用wrapper呢<代码>包装器(foo1,3)不起作用。解释器不知道第二个参数不存在
3
是本例中的第二个参数。@Idlehands,好的。我问错了问题。我更新了答案。第二种方法至少适用于Python2。请再试一次。
#/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)