需求:

有package db_api,其下有很多 module 如 plane.py ship.py ufo.py。这些module内定义了方法如 plane.fly(), ship.float(),ufo.siu()。现在希望有一个装饰器来给装饰这些函数,让其打印log,log中包含调用的参数以及return。

解决办法

首先定义 decorator

def db_log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
func_name = str(func) if func else ''
log_args = str(args) if args else ''
log_kwargs = str(kwargs) if kwargs else ''
eventLog.info("call %s" % func_name)
eventLog.info("args are %s" % log_args)
eventLog.info("kwargs are %s " % log_kwargs) ret = func(*args, **kwargs)
log_ret = str(ret) if ret else ''
eventLog.info("ret are %s" % log_ret)
return ret return wrapper

这没什么问题,问题是,接下来你要手动的去装饰之前的每一个方法如 fly 等。 这里我们用一段代码动态的patch 这些函数

在db_api/init.py 中会import 所有module

import plane
import ufo
import ship

然后用下面的代码动态装饰

for module_obj in dir():
if isinstance(eval(module_obj),type(plane)) and eval(module_obj).__package__ == 'db_api':
# Patch call ables
module_obj = eval(module_obj)
for func_obj in dir(module_obj):
if callable(getattr(module_obj, func_obj)) and not func_obj.startswith('_') and isinstance(getattr(module_obj, func_obj),type(lambda x: x)):
# func_obj = db_log(func_obj)
setattr(module_obj,func_obj,db_log(getattr(module_obj, func_obj)))

最新文章

  1. 【Linux大系】Linux的概念与体系
  2. PhpStorm 快捷键大全 PhpStorm 常用快捷键和配置
  3. Xcode开发中 Code Snippets Library 的相关用法
  4. Android扫盲教程大全经典教程全分享
  5. 【Python②】python之首秀
  6. IIS7配置Gzip压缩 JS压强失败的原因
  7. Cordova webapp实战开发:(2)认识一下Cordova
  8. Yii2 使用八 使用scenarios
  9. jiffies
  10. 关于项目中用到的流程的sql和表
  11. C#_StringBuilder分离字符串实例
  12. java中的xpath,读取xml文档。
  13. Android App开发常用专题开源代码
  14. Lambda 可以转换成委托或expression树
  15. AOJ/搜索递归分治法习题集
  16. selenium.common.exceptions.WebDriverException: Message: 'phantomjs' executab
  17. 关于maven项install时报找不到符号的错误
  18. SpriteBuilder中的粒子系统属性
  19. WebSocket整合SSM(Spring,Struts2,Maven)
  20. Linux查看用户登录信息-last

热门文章

  1. mysql 备份解密脚本
  2. 【Java_基础】Java中Native关键字的作用
  3. DocDokuPLM 2.5安装
  4. Linux菜鸟起飞之路【三】Linux常用命令
  5. URL链接后面的参数解析,与decode编码解码;页面刷新回到顶部jquery
  6. 【实验吧】因缺思汀的绕过&&拐弯抹角&&Forms&&天网管理系统
  7. 使用VS2015编写驱动时出现的部分错误以及解决方法
  8. Luogu3195 [HNOI2008]玩具装箱TOY (方程变形 + 斜率优化 )
  9. Hive 启动报错
  10. redux学习总结