簡體   English   中英

如何在帶有 *args 和 **kwargs 的函數調用中使用默認參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM