题
这周末我已经拆除了碎片米歇尔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实现?我试过了,但不能得到那个工作...
其他提示
编译(),可以控制产生的代码对象,其名称和来源,而EXEC不那么灵活。这也是值得做的事情,这样别人读你的代码时,会学习他们是独立的步骤,并在心里有这个以后,当他们需要给exec不止一次相同的代码更(其中编译()一次,高管多次将快),并编写代码来教育谁读它的未来始终是设计选择一个值得影响。
不隶属于 StackOverflow