python利用装饰器获取函数参数和函数返回值

最近项目需要增加日志可观性,就在想看能不能通过装饰器方式来获取函数的参数和返回值,这样也方便将其写入日志文件,代码如下:

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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容