2017-09-02 61 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)