游戏开发中如何通过变量字符串值调用对应boardx()函数?
如何通过字符串调用对应的boardx()函数?
嘿,我来帮你搞定这个动态调用函数的需求!这里有几种可行的方案,我会从最安全靠谱的开始讲:
方法一:用函数字典映射(首推!)
这是最安全、可读性也最高的做法,完全避开了不安全的字符串执行风险。你可以把所有boardx()函数整理到一个字典里,用字符串作为键,对应的值就是函数本身:
# 先定义好你的各个board函数 def board1(): print("加载游戏面板1") def board2(): print("加载游戏面板2") def board3(): print("加载游戏面板3") # 创建函数映射字典,把函数和对应的字符串绑定 board_funcs = { "board1": board1, "board2": board2, "board3": board3 } # 你的原有代码逻辑 sequence = [1, 2, 3] sequenceIndex = 0 nextCommand = "board" + str(sequence[sequenceIndex]) + "()" # 提取函数名(把末尾的"()"去掉) target_func_name = nextCommand[:-2] # 检查函数是否存在,存在就调用 if target_func_name in board_funcs: board_funcs[target_func_name]() else: print(f"哎呀,找不到对应的函数:{target_func_name}")
这种方式的好处是完全可控,只有你提前放进字典的函数才能被调用,就算nextCommand出点小问题(或者被恶意篡改),也不会执行危险代码,非常适合游戏开发这种场景。
方法二:用eval执行(不推荐,仅作参考)
如果你能100%保证nextCommand的内容绝对安全(比如完全由你的代码生成,不会来自用户输入或者外部数据),那也可以直接用eval来执行这个字符串:
# 先定义board函数 def board1(): print("加载游戏面板1") # 你的原有代码 sequence = [1] sequenceIndex = 0 nextCommand = "board" + str(sequence[sequenceIndex]) + "()" # 直接执行字符串命令 eval(nextCommand)
⚠️ 敲黑板:eval是一把双刃剑,它会执行任何传入的字符串代码!如果nextCommand有可能被用户修改(比如游戏里的输入、存档数据等),那绝对不能用这个方法,否则可能被注入恶意代码,后果很严重。
额外小技巧:批量处理大量board函数
如果你的游戏有很多boardx函数(比如board1到board100),一个个写进字典太麻烦,也可以通过模块的属性来动态获取,不过记得加上白名单校验:
import sys # 获取当前模块的所有属性 current_module = sys.modules[__name__] target_func_name = nextCommand[:-2] # 先检查函数名是否符合"board+数字"的格式,确保是我们要的函数 if target_func_name.startswith("board") and target_func_name[5:].isdigit(): # 从模块里取出函数 target_func = current_module.__dict__.get(target_func_name) # 确认是可调用的函数再执行 if callable(target_func): target_func() else: print(f"{target_func_name}不是一个可调用的函数") else: print(f"无效的函数名:{target_func_name}")
这种方式既省了写字典的功夫,又通过格式校验保证了安全,适合函数数量多的场景。
内容的提问来源于stack exchange,提问作者Jakub Slapek
相关产品推荐
相关产品推荐

