我试图用Python制作游戏引擎作为周末项目"但我有一个问题。
我试图让用户可以通过在文本文件中键入键和函数来声明一个键绑定,但是当我用exec运行该表中的代码时,它会运行该函数我不知道如何通过变量调用函数。 (我也不希望它在运行代码时运行该函数。)
这是我用来执行binds.zdata
代码的代码for line in bind:
try:
exec line
except:
try:
error.write(localtime + " : " + "ERROR: Could not bind key from the bind file : " + line)
except:
pass
这是binds.zdata
中的文字_w = Functions.motion.move().forward()
_a = Functions.motion.move().left()
_s = Functions.motion.move().back()
_d = Functions.motion.move().right()
答案 0 :(得分:6)
您希望在每行末尾丢失()
:
_w = Functions.motion.move().forward
_a = Functions.motion.move().left
_s = Functions.motion.move().back
_d = Functions.motion.move().right
现在你可以通过简单地应用括号来调用函数,例如:
_w()
答案 1 :(得分:4)
我不确定我推荐“exec”,因为有人可以在其中加上任何代码。
但这是你的问题。
_w = Functions.motion.move().forward()
调用函数'forward'并将结果放入_w。
_w = Functions.motion.move().forward
将函数“forward”赋值给变量'_w'。
既然你问我会做什么,我会创建一组代表各种函数的标记,然后让它们在配置文件中进行映射(参见:ConfigParser)。然后解析配置文件。这是一项更多的工作,但更安全。
答案 2 :(得分:3)
我首先更改binds.zdata文件中的行,这样他们就为每个变量分配一个函数:
_w = Functions.motion.move().forward
_a = Functions.motion.move().left
_s = Functions.motion.move().back
_d = Functions.motion.move().right
然后,假设定义了Functions
,我会立即执行文件中的所有行:
try:
execfile('binds.zdata')
except Exception as exc:
error.write(localtime + " : " + "ERROR: executing binds file")
之后,_w
,_a
,_s
,_d
变量将分配给他们所需的功能,您可以照常调用 - 即{{1 },_w()
等
答案 3 :(得分:2)
使用exec读取配置会打开你在运行时遇到的各种痛苦,因为用户的配置文件将是你可信赖的可执行代码。恶意或无意的坏命令将被执行。你可以这样模板化:
def read_config(config_file):
user_button_map = {}
with open(config_file, 'r') as fh:
for line in fh.readlines():
key,func_key = line.strip().split(',')
assert(key in BUTTON_MAP_FUNCTIONS),"no such action"
user_button_map[key] = BUTTON_MAP_FUNCTIONS[func_key]
return user_button_map
BUTTON_MAP_FUNCTIONS = {
"forward" : Functions.motion.move().forward,
"left" : Functions.motion.move().left,
# etc...
}
# sample config file
# w, forward
# a, left
# etc...