在使用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}。
⚠️ 注意事项: