这个周末,我一直在拆解 Michele 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 实现类似的东西,即定义一个新函数并获得它的句柄?我试过了,但无法让它工作......