+ -
当前位置:首页 → 问答吧 → 求帮助??装饰器问题

求帮助??装饰器问题

时间:2011-12-11

来源:互联网

例子如下:
'''
Created on 2011-12-9

@author: Administrator
'''

'''  

02 Created on 2011-3-23  

03  

04 @author: Administrator  

05 ''' 

from time import time  

   

def logged (when):  

  def log(f, *args, **kargs):  

  print('''called:  

  function: %s  

  args :%r  

  kargs:%r''' % (f, args, kargs))  

   

  def pre_logged(f):  

  def wrapper(*args, **kargs):  

  log(f, *args, **kargs)  

  print('in pre_logged')  

  return f(*args, **kargs)  

  return wrapper  

   

  def post_logged(f):  

  def wrapper(*args, **kargs):  
  print('in post_logged *')  

  now = time()  

  try:  

  return f(*args, **kargs)  

  finally:  

  log(f, *args, **kargs)  

  print('time delta: %s' % (time() - now))  

  print('in post_logged')  

  return wrapper  

   

  try:  

  return {"pre":pre_logged, "post":post_logged}[when]  

  except KeyError as e:  

  raise ValueError(e)('must be "pre" or "post" ')  

   

@logged('pre')  

@logged('post')  

def hello(name):  

  print('hello, ', name)  

   

   

hello('world!') 



请问一下这个代码的执行过程是怎么样的??
它是怎么会去调用pre_logged和post_logged函数的????

作者: Mr_JJ_Lian   发布时间: 2011-12-11

自己先把代码贴好看点。缩进正确,空行删了。这种代码懒得看。

作者: iambic   发布时间: 2011-12-11

Python是靠缩进判断语句块的,你这样的代码叫人怎么看。

简单说明装饰器@的用法,下面两段程序的功能是一样的:
Python code
def need_login(f):
    def _(*argList, **argDict):
        if has_login:
            print "succeed!"
            f(*argList, **argDict)
        else:
            print "faild!"

    return _

@need_login
def a(a,b,c):
    print a,b,c
    
has_login = True
a(1,2,3)


Python code
def need_login(f):
    def _(*argList, **argDict):
        if has_login:
            print "succeed!"
            f(*argList, **argDict)
        else:
            print "faild!"

    return _

def a(a,b,c):
    print a,b,c
a = need_login(a)
    
has_login = True
a(1,2,3)

作者: Inpool   发布时间: 2011-12-11

热门下载

更多