Python, ¿cómo pasar un argumento a un parámetro de puntero de función?

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)