码迷,mamicode.com
首页 > 其他好文 > 详细

part 2: decorator装饰器

时间:2014-10-13 21:36:37      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   ar   sp   div   art   

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

 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装饰器

标签:style   blog   color   io   使用   ar   sp   div   art   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!