Reputation: 28030
I have this working timer function in python ver3.6 which runs at an interval of 2 seconds.
def timer_function_working():
threading.Timer(2, timer_function_working).start()
print ("stackoverflow")
timer_function_working()
I want this timer_function to accept the time interval as an argument. Here is the new code;
def timer_function(interval_sec):
threading.Timer(interval_sec, timer_function).start()
print ("stackoverflow")
timer_function(interval_sec=2)
However, I get this error message;
TypeError: timer_function() missing 1 required positional argument: 'interval_sec'
How do I change this timer function to accept argument?
Upvotes: 0
Views: 1687
Reputation: 2067
According to the docs for threading.Timer
, the first argument to Timer
is interval
class threading.Timer(interval, function, args=[], kwargs={})
In your second code block, the first execution runs without issue because you've provided a value for interval
. However, when the function
is invoked at the end of the Timer
's duration, you don't pass any arguments to the function itself, which leads to the error:
TypeError: timer_function() takes exactly 1 argument (0 given)
You can pass an argument to the function that Timer
invokes upon completion in the following way:
import threading
def timer_function(interval_sec):
threading.Timer(interval_sec, timer_function, args=[interval_sec]).start()
print ("stackoverflow")
timer_function(interval_sec=2)
Alternatively, you can use a closure to bind the value interval_sec
to another function, defined within timer_function
that can be called without any arguments:
def timer_function(interval_sec):
def inner_function():
return timer_function(interval_sec)
threading.Timer(interval_sec, inner_function).start()
print ("stackoverflow")
timer_function(interval_sec=2)
Upvotes: 3