我正在使用pygame和box2d编写一个游戏引擎,在character builder中,我希望能够编写将在keydown事件上执行的代码。
我的计划是在字符生成器中有一个文本编辑器,允许您编写类似于以下内容的代码:
if key == K_a:
## Move left
pass
elif key == K_d:
## Move right
pass
我将以字符串的形式检索文本编辑器的内容,并希望代码在这种字符方法中的方法中运行:
def keydown(self, key):
## Run code from text editor
最好的办法是什么?
你可以使用^{}
正如其他人指出的,您可以将文本加载到字符串中并使用
exec "codestring"
。如果已经包含在文件中,使用execfile将避免加载它。一个性能说明:应该避免多次执行代码,因为解析和编译python源代码是一个缓慢的过程。也就是说,没有:
通过将源代码编译成一个代码对象(使用
compile()
)和exec,或者更好地,通过构造一个只构建一次的函数,可以稍微改进这一点。要么要求用户编写“def my_handler(args…)”,要么自己编写,然后执行以下操作:之后:
您可以使用^{} 方法来执行此操作。
定义
eval(code, globals=None, locals=None)
代码只是标准的Python代码——这意味着它仍然需要适当缩进。
globals可以定义自定义的
__builtins__
,这对于安全性很有用。示例
会将
hello
打印到控制台。还可以为代码指定要使用的本地和全局变量:安全问题
不过,要小心。将执行任何用户输入。考虑:
有很多方法可以解决这个问题。最简单的做法是:
这将引发异常,而不是擦除硬盘驱动器。虽然你的程序是桌面的,但如果人们重新分发脚本,这可能是一个问题,我想这是有意的。
奇怪的例子
下面是一个非常奇怪地使用
eval
的示例:这在评估线上的作用是:
contrivedExample
)。消费者现在可以调用contrivedExample.hello()
。)hi
定义为指向hello
失败
结果是(谢谢评论!)您实际上需要使用
exec
语句。哎呀。修改后的示例如下:exec
定义(这看起来很熟悉!) Exec是一个语句:
exec "code" [in scope]
其中scope是本地和全局变量的字典。如果未指定,则在当前范围内执行。代码只是标准的Python代码——这意味着它仍然需要适当缩进。
exec
示例会将
hello
打印到控制台。还可以为代码指定要使用的本地和全局变量:exec
安全问题不过,要小心。将执行任何用户输入。考虑:
打印报表
正如注释者所指出的,
print
是3.0之前的所有Python版本中的一个语句。在2.6中,可以通过键入from __future__ import print_statement
来更改行为。否则,使用:而不是:
相关问题 更多 >
编程相关推荐