2017-06-06 6 views
1

Könnten Sie mir helfen zu verstehen, ob es möglich ist, eine Funktion sowohl mit einem Dekorator und ohne es zu verwenden.Verwerfen Sie den Dekorateur

Beispiel:

def makeitalic(fn): 
    def wrapped(): 
     return "<i>" + fn() + "</i>" 
    return wrapped 

@makeitalic 
def hello(): 
    return "hello, sir or madam!" 

Der einzige Weg, der mir in den Sinn kommt:

def hello(): 
    return "hello, sir or madam!" 

@makeitalic 
def italic_hello(): 
    return(hello()) 

Nun ist es möglich, hallo() ohne den Dekorateur zu benutzen?

+1

Beachten Sie, dass 'italic_hello = makeitalic (hallo)' wäre einfacher - das ist im Grunde der syntaktische Zucker von '@ makeitalic'. – jonrsharpe

+0

Sie könnten die tatsächliche Funktion als Attribut zu 'wrapped' zuweisen. –

+0

Wenn Sie diese Art von dynamischem Verhalten benötigen, verwenden Sie keine Dekoratoren. – pvg

Antwort

0

Nicht im Allgemeinen. Die dekorierte Funktion ersetzt das Original, so dass es keine Möglichkeit gibt, das Original zu erhalten, es sei denn, der Dekorator selbst stellt es explizit zur Verfügung (z. B. indem es in einer globalen Registrierung oder als Attribut für ein Objekt gespeichert wird). (Sie können auf sie als Zellenvariable im Closure-Objekt der verzierten Funktion zugreifen, aber das ist nicht sehr robust und sollte nicht zum Testen und Experimentieren verwendet werden.)