在学装饰器的时候看到这篇文章,[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 后面呢?