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条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号
    • ¥50 安装pyaudiokits失败
    • ¥15 计组这些题应该咋做呀
    • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
    • ¥15 让node服务器有自动加载文件的功能
    • ¥15 jmeter脚本回放有的是对的有的是错的
    • ¥15 r语言蛋白组学相关问题