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

Python:如何用sandbox函数跳过其他函数内指定代码并正常执行

解决思路与实现方案

嘿,这个需求很清晰——咱们要让game_on()里的easter_egg不输出那行讨厌的"Kaizer Sozegg!",也别随便调用sys.exit()搞崩程序,而且main()跑完sandbox()后还得正常走下去。下面给你两种靠谱的实现思路,不用改你现有的game_on()和main()代码:

方案一:包装game_on()的猴子补丁(推荐,稳定可靠)

这个思路是通过猴子补丁替换原始的game_on函数,在包装函数里临时拦截sys.exit和过滤打印输出,执行完后再恢复所有原始状态,完全不影响后续代码运行。

import sys

def game_on():
    ''' I'm not a rat, Agent Kujan. '''
    def easter_egg():
        print('Easter Egg: Mmmm... Cadbury.')
        print("Kaizer Sozegg!")
        sys.exit()
    print('The greatest trick the Easter Bunny ever pulled...')
    # 假设这里有触发easter_egg的逻辑,比如:
    easter_egg()

def sandbox():
    global game_on
    original_game_on = game_on  # 保存原始函数

    def wrapped_game_on():
        # 保存原始的sys.exit和print
        original_exit = sys.exit
        original_print = print

        def filtered_print(*args, **kwargs):
            # 直接打印允许的内容,跳过"Kaizer Sozegg!"
            if args and str(args[0]) != "Kaizer Sozegg!":
                original_print(*args, **kwargs)

        # 替换为我们的自定义版本
        print = filtered_print
        sys.exit = lambda *args: None  # 让sys.exit变成空操作

        try:
            original_game_on()  # 执行原始的game_on逻辑
        finally:
            # 务必恢复所有原始状态,避免影响后续代码
            print = original_print
            sys.exit = original_exit

    # 把全局的game_on替换成包装后的版本
    game_on = wrapped_game_on

def main():
    sandbox()
    game_on()
    print("Main function continues running normally!")  # 验证后续代码正常执行

if __name__ == "__main__":
    main()

运行效果

执行后会输出:

The greatest trick the Easter Bunny ever pulled...
Easter Egg: Mmmm... Cadbury.
Main function continues running normally!

完全不会输出"Kaizer Sozegg!",也不会退出程序,main()后续代码能正常执行。

方案二:修改game_on()内部嵌套函数(hack方案,不推荐)

这个思路是直接修改game_on闭包中的easter_egg函数,替换成我们自己的版本。优点是更直接,但缺点是依赖Python的内部实现(闭包的cell结构),不同Python版本可能失效。

import sys

def game_on():
    ''' I'm not a rat, Agent Kujan. '''
    def easter_egg():
        print('Easter Egg: Mmmm... Cadbury.')
        print("Kaizer Sozegg!")
        sys.exit()
    print('The greatest trick the Easter Bunny ever pulled...')
    easter_egg()

def sandbox():
    # 定义修改后的easter_egg:只打印第一行,不调用sys.exit
    def modified_easter_egg():
        print('Easter Egg: Mmmm... Cadbury.')
    
    # 遍历game_on的闭包cell,找到easter_egg并替换
    if hasattr(game_on, '__closure__') and game_on.__closure__:
        for cell in game_on.__closure__:
            if getattr(cell.cell_contents, '__name__', '') == 'easter_egg':
                cell.cell_contents = modified_easter_egg
                break

def main():
    sandbox()
    game_on()
    print("Main function continues running normally!")

if __name__ == "__main__":
    main()

注意事项

  • 这个方案只在game_on的闭包中确实包含easter_egg函数时有效,如果game_on的实现有变化(比如闭包顺序改变),可能会失效。
  • 不推荐在生产环境使用,适合快速调试场景。

内容的提问来源于stack exchange,提问作者J. Mar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:20:32