背景
服务端程序出了问题,大概知道问题出现的位置,但是如用单元测试用例,则整个服务流程太长,并且本地不一定会出现服务端的错误,为方便调试,需要在本地调试时使用服务端一样的参数
方法
方法1: 使用local方法获取参数
def function(a, b, *args, **kwargs):
before_args_dict = locals()
print(before_args_dict)
c = a + b
return c
通过local获取局部区域的环境变量
以上方法获取参数定义函数内部,可以针对某一个函数,如何将获取参数与函数本身解耦,同时提高获取参数函数的复用性,此时想到了装饰器,代码如下:
from functools import wraps
def get_input(func):
@wraps(func)
def inner(*args, **kwargs):
print(save_input(func, *args, **kwargs))
return func(*args, **kwargs)
return inner
def save_input(func, *args, **kwargs):
save_dict = {}
save_dict.update({
'function_name': func.__name__,
'args': args,
'kwargs': kwargs,
})
return save_dict
@get_input
def func_test(a, b, *args, **kwargs):
c = a + b
return c
if __name__ == '__main__':
res = func_test(2, 3, 4, name='test')
# 输出
{'function_name': 'func_test', 'args': (2, 3, 4), 'kwargs': {'name': 'test'}}
以上方法针对可以json化的参数,可是当入参数是对象时,改怎么办了?
可以将入参以二进制的方式存储,若使用pickle,则注意服务端与本地的pickle版本的一致性