[英]How to use default arguments in a function call with *args and **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
您以接受數字的方式定義了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 wrapper(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
每次要明確提供超時期限時,請按如下方式調用:
wrapper(foo, 1, 2, 3, timeout=60)
def wrapper(foo, *args, **kwargs):
timeout = kwargs.get('timeout') if 'timeout' in kwargs else 10
print 'Timeout = {0}'.format(timeout)
foo(*args)
def foo(*args):
print 'Args = {0}'.format([a for a in args])
wrapper(foo, 1, 2, 3, timeout=20)
# Results
# Timeout = 20
# Args = [1, 2, 3]
弄成這個樣子怎么樣?
#/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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.