文本冒险游戏库开发问题:thens函数提前执行及弃用eval需求
文本冒险游戏Python库问题解决方案
问题1:thens列表函数提前执行
原因
你大概率是把函数调用(比如func())塞进了thens列表,而非存储函数对象(func)。Python中只要给函数加括号就会立即执行,和是否存入列表无关。
解决方法
把函数本身(不带括号)存入thens列表,等用户输入符合条件后再遍历调用:
# 错误写法:函数会立即执行 thens = [show_room(), play_sound()] # 正确写法:存储函数对象,按需调用 thens = [show_room, play_sound] # 触发条件满足时执行函数 user_input = input("输入指令:") if user_input == "look": for func in thens: func() # 此时才执行函数
问题2:弃用eval,避免用户写字符串格式的函数
替代方案1:直接传递可调用对象
让用户把函数(或lambda表达式)作为参数传入,而非字符串。可以设计简单的命令注册机制:
# 定义命令映射字典 commands = {} # 注册命令的装饰器 def command(name): def decorator(func): commands[name] = func return func return decorator # 用户用装饰器注册函数 @command("north") def move_north(): print("你向北走了一步") @command("look") def examine_room(): print("房间里有一张桌子和一扇门") # 处理用户输入 user_input = input("输入指令:").strip() if user_input in commands: commands[user_input]() # 直接调用对应函数,完全不用eval
替代方案2:参数化函数调用
如果需要传递参数,可借助functools.partial固定参数:
from functools import partial # 注册带参数的命令 commands["take"] = partial(pick_up_item, item="key") def pick_up_item(item): print(f"你捡起了{item}")
方案优势
- 安全:彻底避免eval执行恶意代码的风险
- 直观:用户直接编写标准Python函数,无需额外格式转换
- 易维护:函数可正常调试、代码补全,不用处理字符串解析问题
内容的提问来源于stack exchange,提问作者Rat
相关产品推荐
相关产品推荐

