执行语句与/不含任何特殊字符的先前编译

2024-10-02 04:18:43 发布

您现在位置:Python中文网/ 问答频道 /正文

这个周末,我一直在拆除米歇尔西米奥纳托的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]

我发现,在使用这些代码时,完全可以避免编译步骤,只需:

^{pr2}$

现在,我确信这是一个很好的理由,但是我还没有找到这两种方法之间的区别。表现如何?在

既然我在问,用eval是否可以实现类似的功能,比如定义一个新函数并处理它?我试过了,但没能成功。。。在


Tags: 函数src核心returndefcode动态function
2条回答

我看到了一些不同之处。首先,^{}在遇到语法错误时的语义比^{}稍好一些。我怀疑真正的原因是compile的定义对于新行字符的处理是非常明确的,其中{}稍微不那么精确。在

我很好奇为什么compile和{}被用来代替内部函数。我不知道compile/exec允许您控制哪些全局变量可用。非常有趣。在

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

相关问题 更多 >

    热门问题