a7664
Supongamos que tengo un código como:
def myfunc(anotherfunc, extraArgs):
# somehow call `anotherfunc` here, passing it the `extraArgs`
pass
Quiero pasar otra función existente como la anotherfunc
argumento, y una lista o tupla de argumentos como extraArgs
y tiene myfunc
llame a la función pasada con esos argumentos.
es posible? ¿Cómo puedo hacerlo?
manuel salvador
Sí, esto es posible. myfunc
puede llamar a la función pasada como:
def myfunc(anotherfunc, extraArgs):
anotherfunc(*extraArgs)
Aquí hay un ejemplo completamente trabajado:
>>> def x(a, b):
... print('a:', a, 'b:', b)
...
>>> def y(z, t):
... z(*t)
...
>>> y(x, ('hello', 'manuel'))
a: hello b: manuel
-
¿ExtraArgs puede ser una función también? si es asi como lo llamas
– Aysennoussi
09/04/2015 a las 17:49
-
@sekai Sí, extraArgs también puede ser una función.
–Manuel Salvadores
09/04/2015 a las 23:43
-
donde esta documentado esto?
– 4dc0
13 de abril de 2019 a las 1:09
-
@ 4dc0 No creo que sea directamente documentado; es solo una consecuencia natural de cómo funciona el modelo de datos de Python. Todo lo que puede vincularse a un nombre es un objeto; los objetos se pueden pasar a funciones; las funciones se pueden vincular a un nombre (eso es lo que sucede cuando usa
def
); por lo tanto, las funciones se pueden pasar a funciones. Dicho esto, te puede interesar docs.python.org/3.11/howto/funcional.htmlque muestra técnicas elementales que hacer uso de esta realidad, y muestra algunas de las ventajas estándar de la biblioteca diseñado para capitalizar en eso.– Karl Knechtel
2 de julio de 2022 a las 3:52
sabujp
Aquí hay otra forma de usar *args
(y opcionalmente **kwargs
también):
def a(x, y):
print(x, y)
def b(other, function, *args, **kwargs):
function(*args, **kwargs)
print(other)
b('world', a, 'hello', 'dude')
Producción
hello dude
world
Tenga en cuenta que function
, *args
y **kwargs
deben aparecer en ese orden y deben ser los últimos argumentos de la función (b
) que llama function
.
-
Puede encontrar más información sobre *args y **kwargs aquí pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
– Pipo
16 de febrero de 2018 a las 0:40
Ignacio Vázquez-Abrams
Las funciones en Python son objetos de primera clase. Sin embargo, la definición de la función debe ser ligeramente diferente:
def myfunc(anotherfunc, extraArgs, extraKwArgs):
return anotherfunc(*extraArgs, **extraKwArgs)
Artsiom Rudzenka
Claro, es por eso que Python implementa los siguientes métodos donde el primer parámetro es una función:
map(function, iterable, ...)
– Aplicar la función a cada elemento de iterable y devolver una lista de los resultados.filter(function, iterable)
– Construya una lista de aquellos elementos de iterable para los cuales la función devuelve verdadero.reduce(function, iterable [,initializer])
– Aplicar la función de dos argumentos de forma acumulativa a los elementos deiterable
de izquierda a derecha, para reducir el iterable a un solo valor.- lambda
Temizzi
Una función puede ser un parámetro para otra función y una función puede devolver otra función.
Aquí hay un ejemplo:
def out_func(a):
def in_func(b):
print(a + b + b + 3)
return in_func
obj = out_func(1)
print(obj(5)) # outputs 14
Carlos Knechtel
Decoradores son muy poderosos en Python ya que los programadores pasan una función como argumento y también pueden definir una función dentro de otra función.
def decorator(func):
def insideFunction():
print("This is inside function before execution")
func()
return insideFunction
def func():
print("I am argument function")
func_obj = decorator(func)
func_obj()
Producción:
This is inside function before execution
I am argument function
Carlos Knechtel
Es posible llamar a dos o más funciones a la vez, usando una llamada a una función como argumento para la otra:
def anotherfunc(inputarg1, inputarg2):
pass
def myfunc(func = anotherfunc):
print(func)
myfunc(anotherfunc(inputarg1, inputarg2))
Esto causará myfunc
para imprimir el valor de retorno de la anotherfunc
llamar (es decir, None
).
-
Esto no tiene ninguna relación con la pregunta real.
– Karl Knechtel
hace 2 días
Relacionado: stackoverflow.com/questions/47502068/…
– alseether
4 de diciembre de 2017 a las 15:09