decorate all function in all module
需求:
有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)))												
											decorate all function in all module的更多相关文章
- Erlang Module and Function
		
Module -module(Name). 模块是方法的集合.注意这行最后的“.”符号是必不可少的. 这个模块名必须和保存这段代码的文件(后缀为“erl”的文件)有相同的名称. 当我们在使用另一个 ...
 - Function.prototype.toString 的使用技巧
		
Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...
 - 解决sea.js引用jQuery提示$ is not a function的问题
		
在使用sea.js的如下写法引用jQuery文件时, //main.jsdefine(function(require,exports,module){ var $ = require('jquery ...
 - python  function parameter
		
Python 2.7.10 (default, Oct 14 2015, 16:09:02) [GCC 5.2.1 20151010] on linux2 Type "copyright&q ...
 - angular源码阅读,依赖注入的原理:injector,provider,module之间的关系。
		
最开始使用angular的时候,总是觉得它的依赖注入方式非常神奇. 如果你跳槽的时候对新公司说,我曾经使用过angular,那他们肯定会问你angular的依赖注入原理是什么? 这篇博客其实是angu ...
 - JavaScript Patterns 5.4 Module Pattern
		
MYAPP.namespace('MYAPP.utilities.array'); MYAPP.utilities.array = (function () { // dependencies var ...
 - AngularJs angular.injector、angular.module
		
angular.injector 创建一个injector对象, 调用injector对象的方法可用于获取服务以及依赖注入. 格式:angular.injector(modules); modules ...
 - lua module package.seeall选项
		
module 与 package.seeall http://blog.codingnow.com/2006/02/lua_51_module.html 使用 module("test&qu ...
 - lua module环境探秘
		
module 作用 module (name [, ···]) Creates a module. If there is a table in package.loaded[name], this ...
 
随机推荐
- Linux内核——进程管理之CFS调度器(基于版本4.x)
			
<奔跑吧linux内核>3.2笔记,不足之处还望大家批评指正 建议阅读博文https://www.cnblogs.com/openix/p/3262217.html理解linux cfs调 ...
 - 暴力解说之首次部署NGINX
			
前言 本章基于Centos 7.x系统讲解 本章讲解下在项目上线部署的时候对NGINX的操作.有些童鞋在网上百度类似LNMP安装就跟着命令一条一条执行了,如果没报错还好,一旦报错就懵逼状态了.这是对自 ...
 - CSS3中制作倒影box-reflect
			
目前仅在Chrome.Safari和Opera浏览器下支持 box-reflect:none | <direction> <offset>? <mask-box-imag ...
 - Codeforces Round #879 (Div. 2) C. Short Program
			
题目链接:http://codeforces.com/contest/879/problem/C C. Short Program time limit per test2 seconds memor ...
 - 快速入门Numpy
			
教你十分钟学会使用numpy. 简单介绍一下numpy的话,这就是一个基于多维数组的python科学计算的核心库. 基本信息 # 一般用np作为numpy的缩写 import numpy as np ...
 - SQLServer数据库查看死锁、堵塞情况
			
在压力测试过程中,不间断的按F5键执行上面的SQL语句,如果出现死锁或者堵塞现象,就会在执行结果中罗列出来.如果每次连续执行SQL,都有死锁或者堵塞出现,说明死锁或者堵塞的比较严重. --每秒死锁数量 ...
 - jdbc 和 hibernate 比较
			
相同点:都是数据库操作的中间件,都不是线程安全需要即时关闭,都可以对数据库操作进行显式处理. 不同:jdbc使用标准sql语言,hibernate使用HQL,操作对象jdbc直接操作数据传送到数据库, ...
 - AWK原理及命令和文件输入
			
一.awk简介 1.awk是3个姓氏的首字母,代表该语言的3个作者,awk的版本有很多,包括:旧版awk,新版awk(nawk),GNU awk(gawk)等. awk程序有awk命令,括在引 ...
 - 【LeetCode】Linked List Cycle(环形链表)
			
这道题是LeetCode里的第141道题. 题目要求: 给定一个链表,判断链表中是否有环. 进阶: 你能否不使用额外空间解决此题? 简单题,但是还是得学一下这道题的做法,这道题是用双指针一个fast, ...
 - ubuntu上传项目到github
			
https://blog.csdn.net/ajianyingxiaoqinghan/article/details/70544159