Quiero hacer una función que ser un decorador a otra función que se imprimirá detalles de la llamada función - nombres de los parámetros y valores eficaces. Mi implementación actual es esto.decorador para imprimir detalles de la llamada función - nombres de los parámetros y valores eficaces
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)
Un poco funciona, pero con algunos errores:
Para llamada
test(1, 2, 3, 4, 5, d = 6, g = 12.9)
imprime
test (a = 1, b = 2, c = 3, d = 6, g = 12.9)
.
El resultado esperado es
test (a = 1, b = 2, c = 3, args = [4, 5], kwargs = {'d': 6, 'g': 12.9})
me quedé atrapado aquí. ¿Me puede ayudar a encontrar la solución correcta?
Si esto es para la depuración, ¿no sería útil también mostrar el valor de retorno de la función? – Curt
@Curt sí, claro – warvariuc