2017-09-02 4 views
0

Ich bekomme das Grundprinzip von Python Dekoratoren und ich mag die Syntax. Sie scheinen jedoch etwas eingeschränkt zu sein, was Sie tun können.Python Dekorator für mehrere Funktionen als Argumente?

Gibt es eine elegante Möglichkeit, mehrere Funktionen als Argumente wie unten zu behandeln?

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() 

Wo könnte ich den Code child_fn2 setzen? Die wenigen Ideen, die ich versucht habe, scheinen der Einfachheit und Eleganz des Dekorateurs zu entgehen.

Antwort

2

Sie könnten das tun:

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') 

aber es ist wahrscheinlich nicht eine gute konzeptionelle fit für Dekorateure. Konzeptionell sollen Dekorateure die Funktionalität einer einzelnen Funktion, die sie dekorieren, verändern. Eine Funktion, die zwei andere Funktionen gleichberechtigt abbildet, ist als Dekorator wenig sinnvoll. Die neue Funktion, die vom Decorator erstellt wird, lautet jetzt beispielsweise func2 und ersetzt das ursprüngliche func2. Das ist nur für bestimmte Anwendungsfälle sinnvoll, während die Vermeidung von Dekoratorsyntax Ihnen mehr Flexibilität bietet.

Es macht mehr Sinn nicht Dekorateur Syntax:

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) 
Verwandte Themen