博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
part 2: decorator装饰器
阅读量:4956 次
发布时间:2019-06-12

本文共 1641 字,大约阅读时间需要 5 分钟。

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

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     pass11 12 13 >>> foobar.func_doc14 ' DOcarzy stuff '15 >>> foobar.__name__16 'foobar'17 >>> @is_admin18 def foobar(username="someone"):19     """Do carzy stuff"""20     pass21 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     pass13 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_args10         if func_args.get('username') != 'admin':11             raise Exception("Now allow")12         return f(*args, **kwargs)13     return wrapper14 15 @is_admin16 def foobar(username, type="chocolate"):17     """ DOcarzy stuff """18     pass19 20 >>> foobar(username='admin')21 {
'username': 'admin', 'type': 'chocolate'}22 >>>

 

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

你可能感兴趣的文章
【转】Simulink模型架构指导
查看>>
MYSQL数据库的导出的几种方法
查看>>
SQL Server-5种常见的约束
查看>>
硬件之美
查看>>
[转载]java开发中的23种设计模式
查看>>
表格的拖拽功能
查看>>
函数的形参和实参
查看>>
文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号
查看>>
1Caesar加密
查看>>
【TP SRM 703 div2 500】 GCDGraph
查看>>
MapReduce 重要组件——Recordreader组件 [转]
查看>>
webdriver api
查看>>
apache 实现图标缓存客户端
查看>>
MediaWiki左侧导航栏通过特殊页面就可以设置。
查看>>
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>
springboot+mybatis报错Invalid bound statement (not found)
查看>>
Linux环境下SolrCloud集群环境搭建关键步骤
查看>>
P3565 [POI2014]HOT-Hotels
查看>>
MongoDB的简单使用
查看>>