zoukankan      html  css  js  c++  java
  • 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)))
  • 相关阅读:
    Linux 下配置多路径及SCSI扫描磁盘重新发现大小
    vSphere vSwitch网络属性配置详解
    勤动脑筋
    如何用visual studio2013编写简单C语言程序
    两个字符窜,在母窜中查找子窜的位置
    如何安装Microsoft Visual C++6.0
    看张子阳如何在30岁前年薪超过30万觉得很有道理几点
    标志位放错了位置
    注意细节
    探索式学习
  • 原文地址:https://www.cnblogs.com/kramer/p/6775418.html
Copyright © 2011-2022 走看看