Solución:
Para ampliar un poco las otras respuestas:
En la linea:
def wrapper(func, *args):
El * al lado de args
significa “tomar el resto de los parámetros dados y ponerlos en una lista llamada args
“.
En la linea:
func(*args)
El * al lado de args
aquí significa “tomar esta lista llamada args y ‘desenvolverla’ en el resto de los parámetros.
Entonces puedes hacer lo siguiente:
def wrapper1(func, *args): # with star
func(*args)
def wrapper2(func, args): # without star
func(*args)
def func2(x, y, z):
print x+y+z
wrapper1(func2, 1, 2, 3)
wrapper2(func2, [1, 2, 3])
En wrapper2
, la lista se pasa explícitamente, pero en ambos contenedores args
contiene la lista [1,2,3]
.
La forma más sencilla de ajustar una función
func(*args, **kwargs)
… es escribir manualmente un contenedor que llamaría func () dentro de sí mismo:
def wrapper(*args, **kwargs):
# do something before
try:
return func(*a, **kwargs)
finally:
# do something after
En Python, la función es un objeto, por lo que puede pasar su nombre como argumento de otra función y devolverlo. También puede escribir un generador de envoltura para cualquier función anyFunc ():
def wrapperGenerator(anyFunc, *args, **kwargs):
def wrapper(*args, **kwargs):
try:
# do something before
return anyFunc(*args, **kwargs)
finally:
#do something after
return wrapper
Tenga en cuenta también que en Python cuando no sabe o no quiere nombrar todos los argumentos de una función, puede hacer referencia a una tupla de argumentos, que se indica por su nombre, precedido por un asterisco entre paréntesis después de el nombre de la función:
*args
Por ejemplo, puede definir una función que acepte cualquier número de argumentos:
def testFunc(*args):
print args # prints the tuple of arguments
Python proporciona una manipulación aún mayor de los argumentos de las funciones. Puede permitir que una función tome argumentos de palabras clave. Dentro del cuerpo de la función, los argumentos de la palabra clave se guardan en un diccionario. En el paréntesis después del nombre de la función, este diccionario se indica con dos asteriscos seguidos del nombre del diccionario:
**kwargs
Un ejemplo similar que imprime el diccionario de argumentos de palabras clave:
def testFunc(**kwargs):
print kwargs # prints the dictionary of keyword arguments
Puede usar la sintaxis * args y ** kwargs para argumentos de longitud variable.
¿Qué significan * args y ** kwargs?
Y del tutorial oficial de Python
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions