Python中使用threading.Timer调用带参数函数的正确方法

10次阅读

Python中使用threading.Timer调用带参数函数的正确方法

在使用Threading.timer定时执行函数时,若目标函数需要参数,必须通过args或kwargs显式传入;直接写函数名(如warntime)会导致typeerror,因为timer无法自动提供缺失的位置参数。

当你编写如下代码时:

from threading import Timer  def warnTime(i):     i += 1     print(i)  t = Timer(20, warnTime)  # ❌ 错误:未传入参数i t.start()

会触发 TypeError: warnTime() missing 1 required positional argument: ‘i’。这是因为 Timer(delay, function, args=[], kwargs={}) 的第二个参数仅接受可调用对象本身(即函数引用),而不执行它;Timer 在延迟结束后内部调用 function(*args, **kwargs)。你传入的是 warnTime(无括号),但没提供 args,导致调用时缺少必需参数 i。

✅ 正确做法是:将初始参数值通过 args(元组或列表)或 kwargs(字典)显式传递:

from threading import Timer  def warnTime(i):     i += 1     print(f"Warning at count: {i}")  # ✅ 正确:通过 args=[0] 传入 i=0 t = Timer(20, warnTime, args=[0]) t.start()

? 提示:args 接受序列类型(如 [0] 或 (0,)),按位置顺序匹配函数参数;若需关键字传参,可用 kwargs={‘i’: 0}。

⚠️ 注意事项:

立即学习Python免费学习笔记(深入)”;

  • 不要写成 Timer(20, warnTime(0)) —— 这会立即执行 warnTime(0) 并将返回值(None)传给 Timer,导致运行时报错或无效果;
  • 若需在回调中维持状态(如累加计数),函数参数本身是不可变的(如 int),上述示例中 i += 1 仅作用于局部变量;如需持久化,应改用可变对象(如 list)、类属性或 nonlocal 变量;
  • Timer 只执行一次,如需周期性执行,请使用 threading.Thread + while 循环 + time.sleep(),或借助 schedule 等第三方库。

总结:Timer 的设计原则是「延迟调用 + 参数解包」,务必通过 args/kwargs 显式传递所有必需参数,这是避免 missing argument 类型错误的关键。

text=ZqhQzanResources