这个周末我一直在撕毁 Michele Simionato 的 decorator module ,构建保留签名的装饰器。这一切的核心是一个动态生成的函数,其工作方式与此类似...
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
可以让您控制可用的全局变量。非常有趣。
我是一名优秀的程序员,十分优秀!