2017-04-12 15 views
11
def makebold(fn): 
    def wrapped(): 
     return "<b>" + fn() + "</b>" 
    return wrapped 

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

@makeitalic 
@makebold 
def hello(): 
    return "hello world" 

print(hello()) ## returns "<b><i>hello world</i></b>" 

W tym kodzie, dlaczego nie wystarczy zdefiniować funkcje makeitalic() i makebold() i przekazać w funkcji hello?Dekoratory Python vs funkcje przechodzące

Czy brakuje mi czegoś tu, czy dekoratorów naprawdę lepiej dla bardziej skomplikowanych rzeczy?

Odpowiedz

8

W tym kodzie, dlaczego nie zdefiniować po prostu funkcji makeitalic() i makebold() i przekazać w funkcji hello?

Z pewnością mógłbyś! Dekoratory są po prostu cukrem syntaktycznym. Pod maską, co się dzieje:

@makeitalic 
@makebold 
def hello(): 
    return "hello world" 

staje:

def hello(): 
    return "hello world" 

hello = makebold(hello) 
hello = makeitalic(hello) 
+0

Dzięki, wydaje się zbędne w tym przypadku. Jestem pewien, że oferują one wnioski w innych przypadkach użycia. –