2017-09-02 94 views
0

我得到了Python裝飾器的基本原理,我喜歡它的語法。但是,他們似乎對你能做的事情有一點限制。作爲參數的多個函數的Python裝飾器?

有沒有一種優雅的方式去處理多個函數,如下面的參數?

def parent_fn(child_fn1, child_fn2): 
    def wrapper(): 
     print('stuff is happening here') 
     child_fn1() 
     print('other stuff is happening here') 
     child_fn2() 
    return wrapper 

@parent_fn 
def decorated(): 
    print('child_fn1 stuff here') 

decorated() 

我在哪裏可以放入child_fn2代碼?我嘗試過的幾個想法似乎從裝飾者的簡單和優雅中消失。

回答

2

你可以這樣做:

import functools 

def sequence_with(f): 
    def wrap(g): 
     @functools.wraps(g) 
     def sequenced_func(): 
      f() 
      g() 
     return sequenced_func 
    return wrap 

def func1(): 
    print('func1') 

@sequence_with(func1) 
def func2(): 
    print('func2') 

但它可能不是一個很好的概念適用於裝飾。從概念上講,裝飾者應該改變他們裝飾的單個功能的功能;在平等基礎上對另外兩個函數進行排序的函數作爲裝飾器可能沒有多大意義。例如,裝飾者創建的新功能現在名稱爲func2,取代原來的func2。這隻對某些特定的用例纔有意義,而避免裝飾器語法會給你更多的靈活性。

它更有意義,不使用修飾語法:

def sequence(f, g): 
    def sequenced_func(): 
     f() 
     g() 
    return sequenced_func 

def func1(): 
    print('func1') 

def func2(): 
    print('func2') 

sequenced_func = sequence(func1, func2)