Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delay between different function calls

Tags:

python

I have a question about adding delay after calling various functions.

Let's say I've function like:

def my_func1():
    print("Function 1")

def my_func2():
    print("Function 2")

def my_func3():
    print("Function 3")

Currently I've added delay between invoking them like below:

delay = 1
my_func1()
time.sleep(delay)
my_func2()
time.sleep(delay)
my_func3()
time.sleep(delay)

As you can see I needed a few times time.sleep, which I would like to avoid. Using decorator is also not an option, since it might be that I would like to avoid delay when calling one of this function not in a group.

Do you have any tip how to beautify this?

like image 846
Mateusz Avatar asked Sep 28 '21 06:09

Mateusz


2 Answers

I've tested this based on "How to Make Decorators Optionally Turn On Or Off" (How to Make Decorators Optionally Turn On Or Off)

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()

Output:

Function 1
inner
Function 2
inner
Function 3
inner
Function 1
Function 2
Function 3

You can see that it can bypass the delay.

like image 126
EBDS Avatar answered Oct 29 '22 03:10

EBDS


You can define something like this:

def delay_it(delay, fn, *args, **kwargs):
    return_value = fn(*args, **kwargs)
    time.sleep(delay)

then

a = delay_it(1, my_func1, "arg1", arg2="arg2")
b = delay_it(1, my_func2, "arg3")
...
like image 40
Selcuk Avatar answered Oct 29 '22 05:10

Selcuk