David_zhou1 2015-08-31 03:10 采纳率: 0%
浏览 1635

Python 装饰器的疑问?

在学装饰器的时候看到这篇文章,[http://blog.csdn.net/mdl13412/article/details/22608283浅谈python闭包]。感觉很赞。但在最后部分“多个装饰器运行期行为”时糊涂了。
自己用下列程序桌布验证时发现了问题。

 def tracer(msg):
    print "[TRACE] %s" % msg

def login_debug_helper(show_debug_info=False):
    tracer("login_debug_helper")
    def proxy_fun(func):
        tracer("proxy_fun")
        print '3'
        def delegate_fun(username, password):
            print '5'
            tracer("delegate_fun")
            if show_debug_info:
                print "username: %s\npassword: %s" % (username, password)
            return func(username, password)
        print '4'
        return delegate_fun
    return proxy_fun

print 'Declaring login_a'


@login_debug_helper(show_debug_info=True)
def login_a(username, password):
    tracer("login_a")
    print "do some login authentication"
    return True

print '  @2  Call login_a'
login_a("mdl", "pwd")

运行之后,输出的log如下:

 Declaring login_a
[TRACE] login_debug_helper
[TRACE] proxy_fun
3
4
  @2  Call login_a
5
[TRACE] delegate_fun
username: mdl
password: pwd
[TRACE] login_a
do some login authentication

然后就有问题了。为什么“@2 Call login_a“ 在5之前?
为什么“TRACE] delegate_fun” 不是紧跟在[TRACE] proxy_fun 后面呢?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥30 STM32 INMP441无法读取数据
    • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
    • ¥15 用visualstudio2022创建vue项目后无法启动
    • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
    • ¥500 把面具戴到人脸上,请大家贡献智慧
    • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
    • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
    • ¥30 c#打开word开启修订并实时显示批注
    • ¥15 如何解决ldsc的这条报错/index error
    • ¥15 VS2022+WDK驱动开发环境