需求:

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

解决办法

首先定义 decorator

  1. def db_log(func):
  2. @functools.wraps(func)
  3. def wrapper(*args, **kwargs):
  4. func_name = str(func) if func else ''
  5. log_args = str(args) if args else ''
  6. log_kwargs = str(kwargs) if kwargs else ''
  7. eventLog.info("call %s" % func_name)
  8. eventLog.info("args are %s" % log_args)
  9. eventLog.info("kwargs are %s " % log_kwargs)
  10. ret = func(*args, **kwargs)
  11. log_ret = str(ret) if ret else ''
  12. eventLog.info("ret are %s" % log_ret)
  13. return ret
  14. return wrapper

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

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

  1. import plane
  2. import ufo
  3. import ship

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

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

decorate all function in all module的更多相关文章

  1. Erlang Module and Function

    Module   -module(Name). 模块是方法的集合.注意这行最后的“.”符号是必不可少的. 这个模块名必须和保存这段代码的文件(后缀为“erl”的文件)有相同的名称. 当我们在使用另一个 ...

  2. Function.prototype.toString 的使用技巧

    Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...

  3. 解决sea.js引用jQuery提示$ is not a function的问题

    在使用sea.js的如下写法引用jQuery文件时, //main.jsdefine(function(require,exports,module){ var $ = require('jquery ...

  4. python function parameter

    Python 2.7.10 (default, Oct 14 2015, 16:09:02) [GCC 5.2.1 20151010] on linux2 Type "copyright&q ...

  5. angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。

    最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ...

  6. JavaScript Patterns 5.4 Module Pattern

    MYAPP.namespace('MYAPP.utilities.array'); MYAPP.utilities.array = (function () { // dependencies var ...

  7. AngularJs angular.injector、angular.module

    angular.injector 创建一个injector对象, 调用injector对象的方法可用于获取服务以及依赖注入. 格式:angular.injector(modules); modules ...

  8. lua module package.seeall选项

    module 与 package.seeall http://blog.codingnow.com/2006/02/lua_51_module.html 使用 module("test&qu ...

  9. lua module环境探秘

    module 作用 module (name [, ···]) Creates a module. If there is a table in package.loaded[name], this ...

随机推荐

  1. url地址数据参数转化JSON对象(js三种方法实现)

    当我们用get方法提交表单时,在url上会显示出请求的参数组成的字符串,例如:http://localhost:3000/index.html?phone=12345678901&pwd=12 ...

  2. MySQL开启日志跟踪

    在开发过程中有时候会遇到sql相关的问题,但是有时候代码中不会直接看到真实的sql,想要看到mysql中实际执行的是什么sql,可以通过开启日志跟踪方式查看. 1 开启日志跟踪 SET GLOBAL ...

  3. Python Third Day-文件处理

    文件处理 打开文件,得到文件句柄并赋值给一个变量f=open('a.txt','r',encoding='utf-8')#默认打开的方式为r指的是文本文件,全名为‘rt’#w文件方式指的是如果有a.t ...

  4. verilog disable 用法 (易错!)

    disable语句可以退出任何循环,能够终止任何begin..end块的执行,用于仿真验证中. 例如 begin:one ;i<;i=i+) begin:two ) disable one; / ...

  5. 【bug】 1118 Row size too large

    1118 Row size too large Every table (regardless of storage engine) has a maximum row size of 65,535 ...

  6. 自定义View画一条线

    #import "PublishContextView.h" @implementation PublishContextView -(void)drawRect:(CGRect) ...

  7. Linux服务器硬件设备信息查看

    一.cpu信息 cpu信息存储在/proc文件系统的cpuinfo(/proc/cpuinfo)文件里,可以直接查看这个文件以获得cpu信息,所列字段解释如下: processor : 核心编号,如: ...

  8. Django之单表的增删改查

      books/urls.py   """books URL Configuration The `urlpatterns` list routes URLs to vi ...

  9. tomcat 下catalina.out 日志乱码问题处理

    问题: 项目部署到Linux服务器之后,控制台 catalina.out 文件输出的中文为乱码: 解决办法: 方法一:修改tomcat下的模板编码 bin/catalina.sh 文件添加如下配置:J ...

  10. C/C++复杂类型声明

    曾经碰到过让你迷惑不解.类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明.   我们将从每天都能碰到的较 ...