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中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
django 连接数据库 sqlite的例子
Aug 14 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
Python图片的横坐标汉字实例
Dec 04 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
Python操作Word批量生成合同的实现示例
Aug 28 Python
flask框架中的cookie和session使用
Jan 31 Python
Python基于百度AI实现抓取表情包
Jun 27 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
模板引擎正则表达式调试小技巧
2011/07/20 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
11款基于Javascript的文件管理器
2009/10/25 Javascript
Grid得到选择行数据的方法总结
2011/01/17 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
Vue概念及常见命令介绍(1)
2016/12/08 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python logging日志模块以及多进程日志详解
2018/04/18 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
Python文件操作的面试题
2013/06/22 面试题
售后服务经理岗位职责范本
2014/02/22 职场文书
银行求职信范文
2014/05/26 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
十佳家长事迹材料
2014/08/26 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
golang实现浏览器导出excel文件功能
2022/03/25 Golang