Maison  >  Questions et réponses  >  le corps du texte

《python核心编程》中高级闭包和装饰器理解?

1.《python核心编程》的这段程序怎么理解?对于这个函数,书上说两个wraaped是闭包,但是不知道谁是自由变量。

2.代码:

from time import time


def logged(when):
    def log(f, *args, **kwargs):
        print '''Called: 
    function: %s 
    args: %r
    kwargs %r''' % (f, args, kwargs)

    def pre_logged(f):
        def wraper(*args, **kwargs):
                log(f, *args, **kwargs)
                return f(*args, **kwargs)
        return wraper

    def post_logged(f):
        def wrapped(*args, **kwargs):
            now = time()
            try:
                return f(*args, **kwargs)
            finally:
                log(f, *args, **kwargs)
                print "time delta: %s" % (time()-now)
        return wrapped

    try:
        return {"pre": pre_logged, "post": post_logged}[when]
    except KeyError, e:
        raise ValueError(e), 'must bre "pre" or "post"'


@logged("post")
def hello(name):
    print "Hello, ", name

hello('World!')
高洛峰高洛峰2741 Il y a quelques jours667

répondre à tous(2)je répondrai

  • 天蓬老师

    天蓬老师2017-04-18 10:36:08

    La soi-disant fermeture fait référence à une fonction définie dans une fonction. En fait, à proprement parler, toutes les définitions de fonctions situées sous votre fonction enregistrée ci-dessus sont des fermetures

    répondre
    0
  • 迷茫

    迷茫2017-04-18 10:36:08

    À propos des fermetures :
    Lorsqu'une fonction en ligne fait référence à une variable dans la portée externe, nous obtenons une fermeture. Pour créer une fermeture, les points suivants doivent être respectés en même temps :
    1 Il doit y avoir une fonction en ligne. Les fonctions externes de la question sont pre_logged et post_logged, et les fonctions intégrées correspondantes sont wrapper et wrapper.
    2. La fonction en ligne doit référencer les variables de la fonction externe. La question fait référence aux paramètres externes args, *kwargs.
    3. La valeur de retour d'une fonction externe doit être une fonction intégrée. Dans la question, return wrapper, return wrapper est utilisé pour return.

    À propos des décorateurs :
    Pour faire simple, un décorateur est une fonction qui modifie la fonctionnalité d'autres fonctions. La question connectée est un décorateur, qui est utilisé pour décorer la fonction hello que vous définissez.

    @logged("post")
    def hello(name):
        print "Hello, ", name
    
    hello('World!')
    

    Vous avez passé "post" comme paramètre du décorateur. Selon : return {"pre": pre_logged, "post": post_logged}[quand]
    La fonction post_logged est appelée. le temps passé ( time()-now)

    Pour une explication détaillée des décorateurs, veuillez vous référer à "Python Advanced" :
    Explication détaillée des décorateurs

    Ce livre entier est bien traduit et je recommande de le lire.

    répondre
    0
  • Annulerrépondre