通用日志记录功能包装器

时间:2018-05-18 16:28:37

标签: python python-3.x

所以我想要做的就是从常用的库(例如subprocess,shutil等等)中获取一堆预先存在的函数,并将它们包装在一个函数中,该函数将输出函数是什么如果发生任何错误,也要做错误。我目前的代码看起来像这样。

def copytree(self,*args, **kwargs):
    self.debug(f":- Copying tree from \"{args[0]}\" to \"{args[1]}\"")
    try:
        shutil.copytree(*args,**kwargs)
    except Exception as e:
        self.error(f":- Failed to copy tree from \"{args[0]}\" to \"{args[1]}\" ; \"{e}\"")
        return False        
    self.debug(f":- Done")
    return True

我觉得有一种更好的方法可以做到这一点,其中有一个可以在任何函数上使用的通用包装器,但我无法将其概念化。我也不确定是否有办法解释不会在所述通用包装器中引发异常的函数。

另外:self.debug和self.error都来自日志记录模块

1 个答案:

答案 0 :(得分:2)

我会使用function decoratorlogging模块。

这是一个简单而肮脏的例子:

import logging
logging.basicConfig(level=logging.INFO)


# decorator
def logged(func):
    def wrapper(*args, **kwargs):
        try:
            logging.info("started '{0}', parameters : {1} and {2}".
                         format(func.__name__, args, kwargs))
            return func(*args, **kwargs)
        except Exception as e:
            logging.exception(e)
    return wrapper


@logged
def foo(val):
    print(val/2)


if __name__ == "__main__":
    foo("a")

输出:

  

INFO:root:启动'foo',参数:('a',)和{}

     

错误:root:/ str'和'int'不支持的操作数类型

     

追踪(最近一次通话):     文件“C:/Users/xxxx.py”,第9行,在包装器中       return func(* args,** kwargs)     文件“C:/Users/xxxx.py”,第17行,在foo中       打印(VAL / 2)

     

TypeError:/:'str'和'int'

的不支持的操作数类型
相关问题