python装饰器系列(五),,带参数的装饰器的应用
python装饰器系列(五),,带参数的装饰器的应用
带参数的装饰器的应用:
比如有一个函数,只有在对有许可权限的用户开放,执行此函数的用户没有在认证列表里的,就不会执行这个函数。这个该如何实现呢?如下:
1 def check(allow_users): 2 def inner_check(fn): 3 def wrap(username,*args,**kwargs): 4 ‘‘‘This is wrap‘‘‘ 5 if username in allow_users: 6 return fn(username,*args,**kwargs) 7 return "You are illegal users" 8 return wrap 9 return inner_check10 11 12 @check([‘zhaochj‘,‘zcj‘])13 def private(username):14 ‘‘‘The authentication‘‘‘15 return "You are legitimate users"
1 private(‘zhaochj‘)2 ‘You are legitimate users‘
1 private(‘tom‘)2 ‘You are illegal users‘
这样就可以对调用函数进行身份验证
python中一个函数有一些属性是函数本身具有的,比如__name__属性是查看函数名称,如果一个函数被装饰器装饰过后,这个函数的这些属性会发生怎样的变化呢?
以上边的check装饰器和private函数为例子,如下:
1 private.__name__2 ‘wrap‘
private函数的名称是wrap了,这是怎么回事?上边已经说过,这里的private函数被装饰器装饰后它已不再是原来的private函数,private这个函数名称会被指向到wrap这个函数对象,那当然用上边的private.__name__查看函数的属性就会是wrap函数的属性。
那怎样来修正呢?可以这样做,如下:
1 def check_1(allow_users): 2 def inner_check(fn): 3 def wrap(username,*args,**kwargs): 4 ‘‘‘This is wrap‘‘‘ 5 if username in allow_users: 6 return fn(username,*args,**kwargs) 7 return "You are illegal users" 8 wrap.__name__ = fn.__name__10 return wrap11 return inner_check12 13 @check_1([‘zhaochj‘,‘zcj‘])14 def private_1(username):15 ‘‘‘The authentication‘‘‘16 return "You are legitimate users"
1 private_1.__name__2 ‘private_1‘
通过在装饰器把__name__重新赋值后就能更正这个问题,但对一个函数来说像__name__这样类似的属性有许多,如果都是这样手工来修正显然是不现实的,所以python提供了一个wraps装饰器来自动修正这个问题,wraps在functools这个包中,所以可以这样来修正这个问题,如下:
1 import functools 2 3 def check_1(allow_users): 4 def inner_check(fn): 5 @functools.wraps(fn) 6 def wrap(username,*args,**kwargs): 7 ‘‘‘This is wrap‘‘‘ 8 if username in allow_users: 9 return fn(username,*args,**kwargs)10 return "You are illegal users"11 return wrap12 return inner_check13 14 @check_1([‘zhaochj‘,‘zcj‘])15 def private_1(username):16 ‘‘‘The authentication‘‘‘17 return "You are legitimate users"
1 private_1.__name__2 ‘private_1‘
@functools.wraps(fn)这个装饰器相当于执行了wrap.__name__ = fn.__name__这样的操作
python装饰器系列(五)
相关内容
- python-格式化输出(考试必考),,Python与用户交
- python之协程,python, 一、这几天在折腾
- Python学习教程(Python学习路线):教你如何在交互式环
- python-xpath定位方法详解,python-xpath详解,一、xpath基本定
- Sublime text 3搭建Python-Anaconda开发环境,,网络上的教程各
- python+opencv读取视频,调用摄像头,,引用import c
- Python语言importError:cannot import name 'InvalidArgumentEx
- python买卖股票的最佳时机--贪心/蛮力算法简介,python买
- 用 eric6 与 PyQt5 实现python的极速GUI编程(系列01)--Hel
- python 报错TypeError: 'range' object does not suppo
评论关闭