2017-09-14 53 views
-2
def pass_thru(func_to_decorate): 
    def new_func(*args, **kwargs): #1 
     print("Function has been decorated. Congratulations.") 
     # Do whatever else you want here 
     return func_to_decorate(*args, **kwargs) #2 
    return new_func 


def print_args(*args): 
    for arg in args: 
     print(arg) 


a = pass_thru(print_args) 
a(1,2,3) 

>> Function has been decorated. Congratulations. 
1 
2 
3 

我知道*args在#1中使用,因爲它是一個函數聲明。但爲什麼有必要在#2中編寫*args,即使它不是函數聲明?爲什麼我們需要裝飾器中的`* args`?

+1

將位置參數捆綁到args的元組中,然後在調用包裝函數時將它們分開放回單獨的參數中。 – jonrsharpe

回答

1

當函數聲明使用的,*args轉位置參數成元組:

def foo(a, *args): 
    pass 
foo(1, 2, 3) # a = 1, args = (2, 3) 

當在函數調用中使用,*args擴展元組成的位置參數:

def bar(a, b, c): 
    pass 
args = (2, 3) 
foo(1, *args) # a = 1, b = 2, c = 3 

這是兩個相反的過程,所以將它們結合起來可以將任意數量的參數傳遞給裝飾函數。

@pass_thru 
def foo(a, b): 
    pass 
@pass_thru 
def bar(a, b, c): 
    pass 

foo(1, 2)  # -> args = (1, 2) -> a = 1, b = 2 
bar(1, 2, 3) # -> args = (1, 2, 3) -> a = 1, b = 2, c = 3 
相關問題