You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:55:21