Acabo de empezar a aprender Python y descubrí que puedo pasar una función como parámetro de otra función. Ahora, si llamo a foo(bar())
, no pasará como un puntero de función sino el valor de retorno de la función utilizada. Llamar a foo(bar)
pasará la función, pero de esta manera no puedo pasar ningún argumento adicional. ¿Qué sucede si deseo pasar un puntero de función que llama a la bar(42)
?
Quiero la capacidad de repetir una función independientemente de los argumentos que le he pasado.
def repeat(function, times): for calls in range(times): function() def foo(s): print s repeat(foo("test"), 4)
En este caso, se supone que la función foo("test")
debe llamarse 4 veces seguidas. ¿Hay una manera de lograr esto sin tener que pasar “prueba” para repeat
lugar de foo
?
Puedes usar un lambda
:
repeat(lambda: bar(42))
O functools.partial
:
from functools import partial repeat(partial(bar, 42))
O pase los argumentos por separado:
def repeat(times, f, *args): for _ in range(times): f(*args)
Este estilo final es bastante común en la biblioteca estándar y en las principales herramientas de Python. *args
denota un número variable de argumentos, así que puedes usar esta función como
repeat(4, foo, "test")
o
def inquisition(weapon1, weapon2, weapon3): print("Our weapons are {}, {} and {}".format(weapon1, weapon2, weapon3)) repeat(10, inquisition, "surprise", "fear", "ruthless efficiency")
Tenga en cuenta que pongo el número de repeticiones por adelantado para mayor comodidad. No puede ser el último argumento si desea usar la construcción *args
.
(Para completar, puede agregar argumentos de palabras clave también con **kwargs
.)
Deberá pasar los parámetros de foo a la función de repetición:
#! /usr/bin/python3.2 def repeat (function, params, times): for calls in range (times): function (*params) def foo (a, b): print ('{} are {}'.format (a, b) ) repeat (foo, ['roses', 'red'], 4) repeat (foo, ['violets', 'blue'], 4)
Si bien muchas de las respuestas aquí son buenas, esta podría ser útil porque no introduce ninguna repetición innecesaria y el motivo de las devoluciones de llamada en primer lugar es a menudo sincronizarse con otro trabajo fuera del hilo principal de la IU.
¡Disfrutar!
import time, threading def callMethodWithParamsAfterDelay(method=None, params=[], seconds=0.0): return threading.Timer(seconds, method, params).start() def cancelDelayedCall(timer): timer.cancel() # Example def foo (a, b): print ('{} are {}'.format (a, b) ) callMethodWithParametersAfterDelay(foo, ['roses', 'red'], 0)