最近项目需要增加日志可观性,就在想看能不能通过装饰器方式来获取函数的参数和返回值,这样也方便将其写入日志文件,代码如下:
import functools
import time
def get_func_params(func, *args, **kwargs):
dict_param = {}
if len(args) > 0:
var_names = func.__code__.co_varnames
if len(args) == len(var_names):
for i in range(len(var_names)):
dict_param.update({var_names[i]: args[i]})
if len(kwargs) > 0:
dict_param.update(kwargs.items())
return dict_param
def with_method_logging(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
t_begin = time.time()
print('%s method start at %0.4f' % (func.__name__, t_begin))
print('LOG: Running method "%s"' % func.__name__)
func_params = get_func_params(func, *args, **kwargs)
print(func.__name__ + "params dict:======>" + str(func_params))
result = func(*args, **kwargs)
print('LOG: Method "%s" completed' % func.__name__)
print('LOG: Method "%s" result = %s' % (func.__name__, str(result)))
t_end = time.time()
print('%s method end at %0.4f' % (func.__name__, t_end))
print('%s method executed in %s ms' % (func.__name__, t_end - t_begin))
return result
return wrapper
@with_method_logging
def sum(a, b, c):
print(a + b + c)
return a + b + c
if __name__ == '__main__':
sum(1,2,3)