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

文本冒险游戏库开发问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:04:59