首页 > 其他 > 详细

part 2: decorator装饰器

时间:2014-10-13 21:17:48      阅读:314      评论:0      收藏:0      [点我收藏+]

在之前提到过,装饰器内部的函数已经取代了原有的函数(新的函数),那么这个函数会缺失很多属性

 1 def is_admin(f):
 2     def wrapper(*args, **kwargs):
 3         if kwargs.get(usrename) != admin:
 4             raise Exception("Now allow")
 5         return f(*args, **kwargs)
 6     return wrapper
 7 
 8 def foobar(username="soneone"):
 9     """ DOcarzy stuff """
10     pass
11 
12 
13 >>> foobar.func_doc
14  DOcarzy stuff 
15 >>> foobar.__name__
16 foobar
17 >>> @is_admin
18 def foobar(username="someone"):
19     """Do carzy stuff"""
20     pass
21 
22 >>> foobar.__doc__
23 >>> foobar.__name__
24 wrapper
25 >>> 

 

我们可以使用functools来解决

 1 import functools 
 2 def is_admin(f):
 3     @functools.wraps(f)
 4     def wrapper(*args, **kwargs):
 5         if kwargs.get(usrename) != admin:
 6             raise Exception("Now allow")
 7         return f(*args, **kwargs)
 8     return wrapper
 9 
10 def foobar(username="soneone"):
11     """ DOcarzy stuff """
12     pass
13 
14 
15 >>> foobar.__name__
16 foobar
17 >>> foobar.__doc__
18  DOcarzy stuff 
19 >>> 

 

在我们的例子当中,我们总是给装饰器函数传入了username关键字作为参数,我们来构建一个更好的方案

inspect

 1 import functools
 2 import inspect
 3 
 4 def is_admin(f):
 5     @functools.wraps(f)
 6     def wrapper(*args, **kwargs):
 7 
 8         func_args = inspect.getcallargs(f,*args,**kwargs)
 9         print func_args
10         if func_args.get(username) != admin:
11             raise Exception("Now allow")
12         return f(*args, **kwargs)
13     return wrapper
14 
15 @is_admin
16 def foobar(username, type="chocolate"):
17     """ DOcarzy stuff """
18     pass
19 
20 >>> foobar(username=admin)
21 {username: admin, type: chocolate}
22 >>> 

 

part 2: decorator装饰器

原文:http://www.cnblogs.com/jypwn/p/4023034.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!