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)