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

Python闹钟程序回调传参问题:main中alarm_triggered参数如何填写

闹钟程序回调函数传参问题

我正在开发一个闹钟程序,代码如下:

from datetime import datetime
import time

def alarm_checker(event_date_list, alarm_triggered):
    while True:
            time_now = datetime.now().strftime("%Y-%m-%d %H:%M")
            time_now = datetime.strptime(time_now, "%Y-%m-%d %H:%M")
            time.sleep(1)
            for i in event_date_list:
                if time_now == i[3]:
                    i[3] = i[3].strftime("%d-%m-%Y %H:%M")
                    alarm_triggered(i)


def alarm_triggered(i):
     print("Alarm successfully triggered" + i)


def main():
     alarm_checker(test_event_list, alarm_triggered(i=))

我通过对比event_date_list中的时间和当前时间time_now,当两者相同时执行alarm_triggered函数。为了确认是列表中哪个时间触发了闹钟,需要给alarm_triggered传参i。

我的问题是:在main函数调用alarm_checker时,alarm_triggered的参数i该如何填写?i的值仅在alarm_checker运行时才会获取到,初始调用时不知道该传什么。我尝试传空字符串,执行时报错TypeError: 'NoneType' object is not callable,希望得到帮助。

解决方案
  • 直接传递函数对象:在main函数里调用alarm_checker时,只需要传入alarm_triggered函数本身,不需要加括号和参数。因为alarm_checker内部会在匹配到时间时自动调用这个函数并传入i参数。修改后的main函数:

    def main():
        alarm_checker(test_event_list, alarm_triggered)
    

    你之前的写法alarm_triggered(i=)会立即执行函数(此时i未定义或为空),函数返回None,导致alarm_checker接收的是None而非函数对象,所以才会报'NoneType' object is not callable错误。

  • 修复字符串拼接错误:当前alarm_triggered函数中,i是列表的元素,直接和字符串拼接会触发类型错误。可以用格式化字符串来输出:

    def alarm_triggered(i):
        print(f"Alarm successfully triggered for event: {i}")
    

    如果只需要显示触发时间,也可以提取i中的时间字段:

    def alarm_triggered(i):
        print(f"Alarm successfully triggered at: {i[3]}")
    
  • 优化时间处理逻辑:原代码中反复转换时间格式是冗余操作,直接获取分钟精度的当前时间即可,同时要保证event_date_list中的时间是datetime对象,避免重复转换:

    def alarm_checker(event_date_list, alarm_triggered):
        while True:
            # 保留当前时间到分钟级别,忽略秒和微秒
            time_now = datetime.now().replace(second=0, microsecond=0)
            time.sleep(1)
            # 遍历列表时用副本,避免删除元素导致的循环问题
            for i in event_date_list.copy():
                # 如果时间是字符串,先转成datetime对象
                if isinstance(i[3], str):
                    i[3] = datetime.strptime(i[3], "%d-%m-%Y %H:%M")
                if time_now == i[3]:
                    formatted_time = i[3].strftime("%d-%m-%Y %H:%M")
                    alarm_triggered((i, formatted_time))
                    # 若为一次性闹钟,移除已触发事件
                    event_date_list.remove(i)
    

内容的提问来源于stack exchange,提问作者schwitzky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:13:24