如何为Python scheduler传递参数?多参数调度遇问题求助
解决scheduler库调度带参数任务时的立即执行与报错问题
问题原因
你当前代码里,schedule.once的第二个参数传的是SellItem(ItemName, Price + 50000)——这是直接调用了函数,而非传递函数本身。SellItem执行后返回None,所以调度器10秒后会尝试调用None,自然抛出TypeError: NoneType object is not callable;同时函数会在你传参时立即执行一次,这就是为什么会看到两次输出。
解决方法
要给调度任务传递带参数的函数,需要把函数对象和参数分开传递,或用包装器绑定参数避免立即执行,这里有两种常用方式:
方式1:使用lambda表达式包装
用lambda创建匿名函数绑定参数,调度器拿到的是可调用对象,不会立即执行:
import time import datetime as dt from scheduler import Scheduler schedule = Scheduler() ItemName = "Crown" Price = 5000 def SellItem(ItemName, Price): print(f"Item Name = {ItemName}\n" f"Item Price = {Price}") SellItem(ItemName, Price + 50000) # 用lambda包装,避免立即执行 schedule.once(dt.timedelta(seconds=10), lambda: SellItem(ItemName, Price + 50000)) while True: schedule.exec_jobs() time.sleep(1)
方式2:使用functools.partial绑定参数
用functools.partial把函数和参数绑定成可调用对象,适合参数较多的场景:
import time import datetime as dt from scheduler import Scheduler from functools import partial schedule = Scheduler() ItemName = "Crown" Price = 5000 def SellItem(ItemName, Price): print(f"Item Name = {ItemName}\n" f"Item Price = {Price}") SellItem(ItemName, Price + 50000) # 用partial绑定参数 sell_task = partial(SellItem, ItemName, Price + 50000) schedule.once(dt.timedelta(seconds=10), sell_task) while True: schedule.exec_jobs() time.sleep(1)
这两种方式都能避免函数立即执行,同时让调度器在指定时间正确调用带参数的函数。
内容的提问来源于stack exchange,提问作者bro mo
相关产品推荐
相关产品推荐

