Tengo una pregunta sobre cómo agregar un retraso después de llamar a varias funciones.
Digamos que he funcionado como:
def my_func1(): print("Function 1") def my_func2(): print("Function 2") def my_func3(): print("Function 3")Actualmente he agregado un retraso entre invocarlos como a continuación:
delay = 1 my_func1() time.sleep(delay) my_func2() time.sleep(delay) my_func3() time.sleep(delay) Como puede ver, necesité algunas veces time.sleep , que me gustaría evitar. Usar el decorador tampoco es una opción, ya que podría ser que me gustaría evitar demoras al llamar a una de estas funciones que no está en un grupo.
¿Tienes algún consejo para embellecer esto?
No estoy seguro si sé lo que quieres decir, pero podrías intentar:
functions = [my_func1, my_func2, my_func3] for func in functions: func() time.sleep(1)Puedes definir algo como esto:
def delay_it(delay, fn, *args, **kwargs): return_value = fn(*args, **kwargs) time.sleep(delay)luego
a = delay_it(1, my_func1, "arg1", arg2="arg2") b = delay_it(1, my_func2, "arg3") ...He probado esto basado en "Cómo hacer que los decoradores se enciendan o apaguen opcionalmente" ( Cómo hacer que los decoradores se enciendan o apaguen opcionalmente )
from time import sleep def funcdelay(func): def inner(): func() print('inner') sleep(1) inner.nodelay = func return inner @funcdelay def my_func1(): print("Function 1") @funcdelay def my_func2(): print("Function 2") @funcdelay def my_func3(): print("Function 3") my_func1() my_func2() my_func3() my_func1.nodelay() my_func2.nodelay() my_func3.nodelay()Producción:
Function 1 inner Function 2 inner Function 3 inner Function 1 Function 2 Function 3Puede ver que puede evitar el retraso.
No es una buena forma de manejar el retraso en una función; porque cada función debe hacer una sola cosa.
No hagas esto:
def my_func(delay): # do stuff if delay>0: time.sleep(delay) Intente hacer una función de controlador de demora y coloque la demora adecuada después de cada función que le pase.
Prueba esto:
def delay_handler(functions_list,inputs_list,delay_list): for function,cur_input,delay in zip(functions_list,inputs_list,delay_list): function(*cur_input) time.sleep(delay) Consejo 1: Zip iterará tirando cada lista (cualquier iterable) simultáneamente; los primeros elementos en inputs_list y delay_list son para la primera función en function_list y etc.
Consejo 2: el '*' detrás de una lista la desempaquetará.