2017-04-12 2 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>" 

Dans ce code, pourquoi ne pas simplement définir les fonctions makeitalic() et makebold() et passer dans la fonction hello?Décorateurs Python vs fonctions de passage

Ai-je raté quelque chose ici ou est-ce que les décorateurs sont vraiment meilleurs pour des choses plus compliquées?

Répondre

8

Dans ce code, pourquoi ne pas simplement définir les fonctions makeitalic() et makebold() et passer dans la fonction hello?

Vous pouvez certainement! Les décorateurs ne sont que du sucre syntaxique. Sous le capot, ce qui se passe est:

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

devient:

def hello(): 
    return "hello world" 

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

Merci, ne semble pas nécessaire dans ce cas. Je suis sûr qu'ils offrent la concision dans d'autres cas d'utilisation. –