Python: pasar los valores predeterminados de los argumentos de la función a * args o ** kwargs

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?