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使用filetype精确判断文件类型
Jul 02 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
Python中is和==的区别详解
Nov 15 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
基于Python函数和变量名解析
Jul 19 Python
django 控制页面跳转的例子
Aug 06 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
python利用opencv保存、播放视频
Nov 02 Python
python函数超时自动退出的实操方法
Dec 28 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 Python
Python创建SQL数据库流程逐步讲解
Sep 23 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配置参数总结
2013/06/14 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
javascript制作2048游戏
2015/03/30 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
毕业生幼师求职自荐信
2013/10/01 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
青年志愿者活动方案
2014/08/17 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python