Mon code est le suivant.

#!/usr/bin/env python3

def use_logging(func):
  def _deco():
    print("%s is running" % func.__name__)
    func()
  return _deco

@use_logging
def bar():
  print('i am bar')

Quand j'exécute bar() , la sortie est

bar is running
i am bar

Quand j'exécute use_logging(bar)() , la sortie a _deco is running.

Production:

_deco is running
bar is running
i am bar

Je veux savoir pourquoi _deco is running s'affiche lors de l'exécution de use_logging(bar)() , et comment cela fonctionne-t-il?

De plus, j'ajoute print ("hhhhhhh") avant def _deco():, le code est le suivant:

def use_logging(func):
  print ("hhhhhhh")
  def _deco():
    print ("_deco func")
    print("%s is running" % func.__name__)
    func()
  return _deco

@use_logging
def bar():
  print('i am bar')

Quand j'exécute à nouveau use_logging(bar)(), le résultat est:

hhhhhhh
hhhhhhh
_deco func
_deco is running
_deco func
bar is running
i am bar

Les first two lines sont tous "hhhhhhh", pouvez-vous me dire la raison pour laquelle the second "hhhhhhh" s'affiche?

3
xoyabc 10 mars 2021 à 19:10

1 réponse

Meilleure réponse

Parce que quand vous le faites:

use_logging(bar)() 

Après avoir fait:

@use_logging
def bar():
  print('i am bar')

Vous décorez la fonction renvoyée par votre décorateur lors de l'invocation précédente. C'est du sucre syntaxique pour:

bar = use_logging(bar)

Et la journalisation a renvoyé la fonction _deco définie en interne. Remarque, si vous:

print(bar)

Vous obtenez:

<function use_logging.<locals>._deco at 0x7fa2c50473a0>
1
juanpa.arrivillaga 10 mars 2021 à 18:50