这周末我已经拆除了碎片米歇尔Simionato的装饰模块,即建立签名保留装饰。在这一切的心脏有一个动态生成的函数,它的工作原理与此类似...

src = """def function(a,b,c) :\n    return _caller_(a,b,c)\n"""
evaldict = {'_caller_' : _caller_}
code = compile(src, '<string>', 'single')
exec code in evaldict
new_func = evaldict[function]

我已经发现,用这种代码鬼混,该编译步骤可以完全避免,去单:

exec src in evaldict

现在,我敢肯定有一个很好的理由额外的步骤,但我一直没能找到这两种方法之间的区别是什么。性能

和因为我在问,可能类似的东西,也就是定义一个新的功能,并获得它的句柄,与EVAL实现?我试过了,但不能得到那个工作...

有帮助吗?

解决方案

有我看到一些区别。首先, compile 在脸上稍微好一点的语义比语法错误的 exec 。我怀疑,真正的原因是compile的定义是非常明确的关于新行字符的处理,其中exec有点不太精确。

我好奇,为什么compile并且其中以代替内部函数被使用exec。我不知道compile / exec可以让你控制哪些全局可用。非常有趣。

其他提示

编译(),可以控制产生的代码对象,其名称和来源,而EXEC不那么灵活。这也是值得做的事情,这样别人读你的代码时,会学习他们是独立的步骤,并在心里有这个以后,当他们需要给exec不止一次相同的代码更(其中编译()一次,高管多次将快),并编写代码来教育谁读它的未来始终是设计选择一个值得影响。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top