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

如何简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:27:00