part 2: decorator装饰器

本文探讨了Python中装饰器如何影响被装饰函数的属性,并介绍了使用functools.wraps和inspect模块来保持函数元信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 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 >>> 

 

转载于:https://www.cnblogs.com/jypwn/p/4023034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值