Considere el ejemplo:
def decorator(func): def wrapper(*args, **kwargs): print(args, kwargs) func(*args, **kwargs) return wrapper @decorator def foo(x, y, z=0): pass foo(5, 5)
Salida:
(5, 5) {}
¿Por qué no (5, 5) {'z': 0}
? ¿Cómo pasar todos los valores predeterminados de la función foo
a *args
o **kwargs
usando solo decorator (para funciones) o metaclase (para métodos de clase, por ejemplo __init__
)?
La envoltura es simplemente una función normal. No tiene “acceso” a las partes internas de la función envuelta.
Tendrías que usar la introspección para conseguirlos. Vea una pregunta relacionada:
¿Cómo averiguar los valores predeterminados del argumento de una función particular en otra función en Python?