¿Cómo funciona el uso de una función (devolución de llamada) como argumento para otra función en Python?

3 minutos de lectura

avatar de usuario de a7664
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 extraArgsy tiene myfunc llame a la función pasada con esos argumentos.

es posible? ¿Cómo puedo hacerlo?

  • Relacionado: stackoverflow.com/questions/47502068/…

    – alseether

    4 de diciembre de 2017 a las 15:09

Avatar de usuario de Manuel Salvadores
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


avatar de usuario de sabujp
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, *argsy **kwargs deben aparecer en ese orden y deben ser los últimos argumentos de la función (b) que llama function.

Avatar de usuario de Ignacio Vázquez-Abrams
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)

Avatar de usuario de Artsiom Rudzenka
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 de iterablede izquierda a derecha, para reducir el iterable a un solo valor.
  • lambda

Avatar de usuario de Temizzi
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

Avatar de usuario de Karl Knechtel
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

Avatar de usuario de Karl Knechtel
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

¿Ha sido útil esta solución?