【发布时间】:2011-09-06 05:09:45
【问题描述】:
我想创建一个函数,作为另一个函数的装饰器将打印该函数调用详细信息 - 参数名称和有效值。我目前的实现是这样的。
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 是的,当然
标签: python