1

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

4

2 回答 2

2

我看到了一些差异。首先,compile在面对语法错误时,语义比exec. 我怀疑真正的原因是,compile对于换行符的处理,定义非常明确,exec但不太精确。

我很好奇为什么compile以及exec在哪里被用来代替内部函数。我不知道compile/exec可以让您控制可用的全局变量。很有意思。

于 2009-05-25T15:19:16.277 回答
2

compile() 允许您控制创建的代码对象及其名称和来源,而 exec 则不那么灵活。这样做也是值得的,其他人在阅读您的代码时会知道它们是单独的步骤,并在以后需要多次执行相同的代码时记住这一点(其中 compile() 一次,exec 多次将是更快),并且编写代码以教育下一个阅读它的人总是对设计选择产生有价值的影响。

于 2009-05-25T19:37:26.480 回答