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
相关产品推荐
相关产品推荐

