fontsize - set title python



Ordre d'exécution du décorateur (1)

Les décorateurs enveloppent la fonction qu'ils décorent. Donc make_bold décoré le résultat du décorateur make_italic , qui a décoré la fonction hello .

La syntaxe @decorator n'est en réalité qu'un sucre syntaxique; le suivant:

@decorator
def decorated_function():
    # ...

est vraiment exécuté comme:

def decorated_function():
    # ...
decorated_function = decorator(decorated_function)

en remplaçant l'objet originorn_function par le decorator() renvoyé.

Les décorateurs superposés répètent ce processus.

Donc, votre échantillon:

@make_bold
@make_italic
def hello():
  return "hello world"

peut être étendu à:

def hello():
  return "hello world"
hello = make_bold(make_italic(hello))

Lorsque vous appelez hello() maintenant, vous appelez réellement l'objet renvoyé par make_bold() . make_bold() renvoyé un lambda qui appelle la fonction make_bold , qui correspond à la valeur de retour de make_italic() , qui est également un lambda qui appelle hello() . En développant tous ces appels, vous obtenez:

hello() = lambda : "<b>" + fn() + "</b>" #  where fn() ->
    lambda : "<i>" + fn() + "</i>" # where fn() -> 
        return "hello world"

alors le résultat devient:

"<b>" + ("<i>" + ("hello world") + "</i>") + "</b>"
def make_bold(fn):
    return lambda : "<b>" + fn() + "</b>"

def make_italic(fn):
    return lambda : "<i>" + fn() + "</i>"

@make_bold
@make_italic
def hello():
  return "hello world"

helloHTML = hello()

Sortie: "<b><i>hello world</i></b>"

Je comprends approximativement les décorateurs et leur fonctionnement avec l'un d'entre eux dans la plupart des exemples.

Dans cet exemple, il y en a 2. D'après la sortie, il semble que @make_italic s'exécute en premier, puis @make_bold .

Cela signifie-t-il que pour les fonctions décorées, la fonction sera d'abord exécutée, puis dirigée vers le haut pour les autres décorateurs? Comme @make_italic abord puis @make_bold , au lieu de l'inverse.

Cela signifie donc que cela diffère de la norme de la méthode de programmation descendante dans la plupart des programmes? Juste pour ce cas de décorateur? Ou ai-je tort?





python-decorators