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

