我一直在寻找的Python代码动态评估,并遇到了eval()和compile()功能,以及exec声明.
有人可以解释之间的区别eval和exec怎样的不同模式,compile()适应吗?
我正在寻找允许在 python 中内联定义函数或多行 lambda 的最佳食谱。
例如,我想执行以下操作:
def callfunc(func):
func("Hello")
>>> callfunc(define('x', '''
... print x, "World!"
... '''))
Hello World!
Run Code Online (Sandbox Code Playgroud)
define我在这个答案中找到了该函数的示例:
def define(arglist, body):
g = {}
exec("def anonfunc({0}):\n{1}".format(
arglist,
"\n".join(" {0}".format(line) for line in body.splitlines())), g)
return g["anonfunc"]
Run Code Online (Sandbox Code Playgroud)
这是一种可能的解决方案,但并不理想。理想的功能是:
anonfunc更好地隐藏内部结构(例如,在函数范围内没有)以及一些我没有想到的事情。我有一个非常好的实现,完成了上述大部分内容,但不幸的是我失败了。我想知道是否有其他人做过类似的东西。
我很清楚这在 Python 用户中是有争议的,并且被认为是 hack 或 unpythonic。我还知道 python-dev 邮件列表上有关多行 lambda 的讨论,并且故意省略了类似的功能。然而,从同样的讨论中我了解到许多其他人也对这样的功能感兴趣。
我不是在问这是否是一个好主意,而是:既然有人决定实施这个,(要么出于乐趣和好奇,要么出于疯狂,真正认为这是一个好主意,要么被枪指着)如何使匿名define工作尽可能接近def使用Python(2.7或3.x)当前的设施?
更详细地解释一下为什么,这对于 GUI 中的回调来说非常方便:
# gtk example:
self.ntimes = 0
button.connect('clicked', …Run Code Online (Sandbox Code Playgroud)