《python核心编程》中高级闭包和装饰器理解?
高洛峰
高洛峰 2017-04-18 10:34:08
0
2
684

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!')
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(2)
Peter_Zhu

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

迷茫

À 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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal