Estoy tratando de llamar a una función dentro de otra función en python, pero no puedo encontrar la sintaxis correcta. Lo que quiero hacer es algo como esto:
def wrapper(func, args):
func(args)
def func1(x):
print(x)
def func2(x, y, z):
return x+y+z
wrapper(func1, [x])
wrapper(func2, [x, y, z])
En este caso, la primera llamada funcionará y la segunda no. Lo que quiero modificar es la función de contenedor y no las funciones llamadas.
def wrapper(func, *args)
es lo quemethod(params object[] args)
está en C #.*args
debe ser el último argumento en la definición de la función.The * next to args means "take the rest of the parameters given and put them in a list called args".
Los pone en una tupla, no en una lista.La forma más sencilla de ajustar una función.
... es escribir manualmente un contenedor que llame a func () dentro de sí mismo:
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 contenedor para cualquier función anyFunc () :
Tenga en cuenta también que en Python cuando no sabe o no quiere nombrar todos los argumentos de una función, puede referirse a una tupla de argumentos, que se denota por su nombre, precedida por un asterisco entre paréntesis después el nombre de la función:
Por ejemplo, puede definir una función que tome cualquier número de argumentos:
Python proporciona una manipulación aún mayor en los argumentos de la función. Puede permitir que una función tome argumentos de palabras clave. Dentro del cuerpo de la función, los argumentos de las palabras clave se encuentran en un diccionario. Entre paréntesis después del nombre de la función, este diccionario se denota con dos asteriscos seguidos del nombre del diccionario:
Un ejemplo similar que imprime el diccionario de argumentos de palabras clave:
fuente
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
fuente
La respuesta literal a su pregunta (para hacer exactamente lo que le pidió, cambiando solo el contenedor, no las funciones o las llamadas a funciones) es simplemente alterar la línea
leer
Esto le dice a Python que tome la lista dada (en este caso,
args
) y pase su contenido a la función como argumentos posicionales.Este truco funciona en ambos "lados" de la llamada a la función, por lo que una función definida como esta:
sería capaz de aceptar tantos argumentos posicionales como le arrojes, y colocarlos a todos en una lista llamada
args
.Espero que esto ayude a aclarar un poco las cosas. Tenga en cuenta que todo esto también es posible con los dictados / argumentos de palabras clave, utilizando en
**
lugar de*
.fuente
Necesita usar argumentos para desempaquetar.
fuente
Una pequeña adición a las respuestas anteriores, ya que no pude encontrar una solución para un problema, que no vale la pena abrir una nueva pregunta, pero me llevó aquí.
He aquí un pequeño fragmento de código, que combina
lists
,zip()
y*args
, para proporcionar un envoltorio que puede hacer frente a una cantidad desconocida de funciones con una cantidad desconocida de argumentos.Tenga en cuenta que eso
zip()
no proporciona una verificación de seguridad para las listas de longitud desigual, vea los iteradores de zip que afirman la misma longitud en python .fuente