
在使用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}。
⚠️ 注意事项:
BIWEB 门户版几经周折,最终与大家见面了。BIWEB门户版建立在ArthurXF5.8.3底层上,有了更加强大的功能。 BIWEB WMS v5.8.3 (2010.1.29) 更新功能如下: 1.修正了底层getInfo方法中的调用参数,做到可以根据字段进行调用。 2.修正了栏目安装和卸载后,跳转链接的错误。 3.修正所有栏目分类系统,提交信息页面错误。 4.新增后台删除信息后仍停留原分
立即学习“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 类型错误的关键。









