python如何为被装饰的函数保留元数据


Posted in Python onMarch 21, 2018

本文实例为大家分享了python为被装饰的函数保留元数据的具体代码,供大家参考,具体内容如下

案例:

       在函数对象中保存着一些函数的元数据,如:

              f.__name__           函数名

              f.__doc__              函数文档

              f.__moudle__       函数所属模块名

              f.__dict__              属性字典

              f.__defaults__       默认参数组

              ……

       在使用装饰器后,在装饰器里访问以上属性时,我们看到的是装饰器函数的元数据

       需求:

              实现在装饰器函数中,保留 被装饰函数 的元数据

如何实现?

       通过 functools中的wraps, update_wrapper方法实现,每个都可单独实现

#!/usr/bin/python3
 
import time
from functools import (wraps, update_wrapper, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
 
 
def count_time(func):
  """
  给目标函数加上计算运行时间统计
  """
  # 这个装上器和update_wrapper一样,默认参数WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  @wraps(func)
  def wrapper(*args, **kwargs):
    start_time = time.time()
     
    # 定义result接收函数返回值,并且在装饰函数最后返回回去
    resutl = func(*args, **kwargs)
    print('运行时间:', time.time()-start_time)
    return resutl
   
  # 其中默认参数 WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  # update_wrapper(wrapper, func)
  return wrapper
 
 
@count_time
def add(num=100):
  """
  计算 0~num 累加值,默认num=100
  """
  time.sleep(1)
  return sum([x for x in range(num+1)])
 
if __name__ == '__main__':
  print('函数名:', add.__name__)
  print('属性字典:', add.__dict__)
  print('函数默认参数:', add.__defaults__)
  print('函数所在模块:', add.__module__)
  print('函数文档:', add.__doc__)
   
  # 打印两个默认参数
  print(WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
  result = add()
  print(result)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python爬虫模拟登录带验证码网站
Jan 22 Python
python脚本实现验证码识别
Jun 07 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
python中字符串内置函数的用法总结
Sep 13 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
python 进程的几种创建方式详解
Aug 29 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
学会Python数据可视化必须尝试这7个库
Jun 16 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 #Python
Python反转序列的方法实例分析
Mar 21 #Python
Python常见工厂函数用法示例
Mar 21 #Python
python如何统计序列中元素
Jul 31 #Python
python如何读写json数据
Mar 21 #Python
python如何读写csv数据
Mar 21 #Python
python如何让类支持比较运算
Mar 20 #Python
You might like
PHP初学者头疼问题总结
2006/10/09 PHP
php smarty的预保留变量总结
2008/12/04 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
详解react-redux插件入门
2018/04/19 Javascript
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python可跨平台实现获取按键的方法
2015/03/05 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
eBay德国站:eBay.de
2017/09/14 全球购物
荟萃全球保健品:维他购
2018/05/09 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
食品安全承诺书范文
2014/08/29 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书