如何简化Python函数中重复的退出、暂停标志位校验代码?
解决方案
我们可以通过自定义异常+状态检查工具函数的方式实现单行调用的效果,不需要修改现有业务逻辑,也不用引入多进程:
- 用类封装全局的终止、暂停状态,避免散写
global变量 - 定义自定义异常
TaskTerminated,当检查到终止标记时抛出,直接中断上层任务函数执行 - 把暂停逻辑和终止检查都封装到单独的
check_task_state()函数中,在需要加退出/暂停点的位置调用这一个函数即可
完整可运行代码
import keyboard import time # 自定义异常:用于终止任务 class TaskTerminated(Exception): pass # 状态管理类,统一管理全局标记 class TaskState: red_flag = False pause_flag = False @classmethod def set_red_flag(cls): cls.red_flag = True @classmethod def toggle_pause_flag(cls): cls.pause_flag = not cls.pause_flag print(f"暂停状态切换:{'已暂停' if cls.pause_flag else '已恢复'}") # 绑定热键 keyboard.add_hotkey("end", TaskState.set_red_flag) keyboard.add_hotkey("space", TaskState.toggle_pause_flag) # 核心复用函数:检查状态,处理暂停+终止逻辑 def check_task_state(): # 先检查是否要终止 if TaskState.red_flag: raise TaskTerminated("任务被用户终止") # 再处理暂停逻辑 while TaskState.pause_flag: time.sleep(1/6) # 暂停期间也支持直接终止 if TaskState.red_flag: raise TaskTerminated("任务被用户终止") # ------------------- 业务代码示例 ------------------- def loop_task(): # 对应你原有的循环场景 for i in range(30): print("test", i) time.sleep(1) # 原来的多行判断替换为这一行即可 check_task_state() def multi_exit_task(): # 对应你说的多退出点非循环场景,比如输出1-511的奇数 for num in range(1, 512, 2): print(num) time.sleep(0.1) check_task_state() # 顺序执行的步骤中间也可以加检查点 print("第一阶段执行完成") check_task_state() print("第二阶段执行开始,运行其他宏操作") # 其他业务逻辑... if __name__ == "__main__": try: # 运行对应任务即可 # loop_task() multi_exit_task() except TaskTerminated: print("任务已正常终止")
使用说明
- 所有需要加退出/暂停检查的位置,只需要写一行
check_task_state()即可,不需要重复写判断逻辑 - 热键逻辑和状态管理完全和业务代码解耦,新增任务也不需要重复写热键绑定、标记定义的代码
- 完全兼容kivy场景,不需要开额外进程,所有逻辑都在主线程运行
- 暂停状态下按
end键也可以直接终止任务,不需要先恢复运行
内容的提问来源于stack exchange,提问作者Creeden
相关产品推荐
相关产品推荐

