我想做一个函数,作为装饰器到另一个函数将打印该函数调用细节 - 参数名称和有效值。我目前的实施是这样的。修饰器打印函数调用细节 - 参数名称和有效值
def describeFuncCall(func):
'''Decorator to print function call details - parameters names and effective values'''
def wrapper(*func_args, **func_kwargs):
print 'func_code.co_varnames =', func.func_code.co_varnames
print 'func_code.co_argcount =', func.func_code.co_argcount
print 'func_args =', func_args
print 'func_kwargs =', func_kwargs
params = []
for argNo in range(func.func_code.co_argcount):
argName = func.func_code.co_varnames[argNo]
argValue = func_args[argNo] if argNo < len(func_args) else func.func_defaults[argNo - func.func_code.co_argcount]
params.append((argName, argValue))
for argName, argValue in func_kwargs.items():
params.append((argName, argValue))
params = [ argName + ' = ' + repr(argValue) for argName, argValue in params]
print(func.__name__ + ' (' + ', '.join(params) + ')')
return func(*func_args, **func_kwargs)
return wrapper
@describeFuncCall
def test(a, b = 4, c = 'blah-blah', *args, **kwargs):
pass
test(1)
#test(1, 3)
#test(1, d = 5)
test(1, 2, 3, 4, 5, d = 6, g = 12.9)
有点儿工作,但也有一些缺陷:
对于呼叫
test(1, 2, 3, 4, 5, d = 6, g = 12.9)
它打印
test (a = 1, b = 2, c = 3, d = 6, g = 12.9)
。
预期的结果是
test (a = 1, b = 2, c = 3, args = [4, 5], kwargs = {'d': 6, 'g': 12.9})
我被困在这里。你能帮我找到正确的解决方案吗?
如果这是为了调试,也可能没有用也显示函数返回值吗? – Curt 2017-05-11 02:17:27
@Curt是的,当然 – warvariuc 2017-05-11 04:37:43