为何在Python的exec()中需要使用compile()函数?
为什么在exec中需要使用compile()函数?
假设我们有模块路径:
path = "..\blah\blah\myfolder\mymodule.py"
模块内容为:
print('hi')
执行以下两段代码,输出结果完全一致:
exec(compile(open(path, 'rb').read(), path, 'exec'))
和
exec(open(path, 'rb').read())
那为什么还要用compile()函数?原因主要有这几点:
错误定位更清晰:如果模块代码里存在语法错误或运行时错误,使用
compile()并传入文件路径作为第二个参数,报错信息会直接指向该文件的具体行号;而直接执行字符串形式的代码,报错会显示<string>作为来源,很难快速定位问题所在。重复执行更高效:当需要多次执行同一段代码时,
compile()会把源代码编译成字节码一次,后续每次exec只需要运行字节码即可;而直接exec字符串的话,每次都要重新编译,重复执行次数越多,性能差距越明显。执行模式更明确:
compile()的第三个参数可以指定执行模式(exec/eval/single),显式声明代码的执行语境。虽然直接exec字符串默认是exec模式,但明确指定模式能避免歧义,比如如果要执行单个表达式并获取返回值,就可以用eval模式配合compile()。提前校验语法:调用
compile()时会先检查代码的语法正确性,如果有语法错误会立刻抛出SyntaxError;而直接exec字符串的话,只有到运行时才会暴露语法问题,提前校验能更早发现错误。
内容的提问来源于stack exchange,提问作者neliut
相关产品推荐
相关产品推荐

