所以我想做的本质上是从常用的库(例如 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 都来自日志模块
这是一个简单而肮脏的例子:
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:started 'foo', 参数: ('a',) 和 {}
错误:root:/不支持的操作数类型:“str”和“int”
回溯(最近一次调用最后一次): 文件“C:/Users/xxxx.py”,第 9 行,包装器中 返回 func(*args, **kwargs) 文件“C:/Users/xxxx.py”,第 17 行,位于 foo 中 打印(val/2)
类型错误:/ 不支持的操作数类型:“str”和“int”
我推荐这个方法:
def log_function(logger: Logger):
def logger_wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
logger.info(f"Called {func.__name__}({args}, {kwargs})")
func(*args, **kwargs)
return inner
return logger_wrapper
你可以像这样使用它
@log_function(logger=getLogger())
def foo(val):
print(val/2)
这允许您根据需要配置记录器。