在 Antti 发布他的回答Python 2 support the Python 3 exec function syntax之前,我找到了几个这样做的选项。
第一个表达式也可以是长度为 2 或 3 的元组。在这种情况下,必须省略可选部分。形式exec(expr, globals)
等价于exec expr in globals
,而形式exec(expr, globals, locals)
等价于exec expr in globals, locals
。exec 的元组形式提供了与 Python 3 的兼容性,其中 exec 是一个函数而不是语句。
如果您出于某种原因不想使用它,这里是我找到的所有其他选项。
导入存根
您可以声明两个不同的导入存根并导入与当前解释器一起使用的任何一个。这是基于我在 PyDev 源代码中看到的。
这是您在主模块中放入的内容:
try:
from exec_python2 import exec_code #@UnusedImport
except:
from exec_python3 import exec_code #@Reimport
这是您放入的内容exec_python2.py
:
def exec_code(source, global_vars, local_vars):
exec source in global_vars, local_vars
这是您放入的内容exec_python3.py
:
def exec_code(source, global_vars, local_vars):
exec(source, global_vars, local_vars)
在 Eval 中执行
Ned Batchelder发布了一种将语句包装exec
在调用中的技术,eval
因此它不会在 Python 3 中导致语法错误。它很聪明,但不清楚。
# Exec is a statement in Py2, a function in Py3
if sys.hexversion > 0x03000000:
def exec_function(source, filename, global_map):
"""A wrapper around exec()."""
exec(compile(source, filename, "exec"), global_map)
else:
# OK, this is pretty gross. In Py2, exec was a statement, but that will
# be a syntax error if we try to put it in a Py3 file, even if it isn't
# executed. So hide it inside an evaluated string literal instead.
eval(compile("""\
def exec_function(source, filename, global_map):
exec compile(source, filename, "exec") in global_map
""",
"<exec_function>", "exec"
))
六包
六包是一个兼容性库,用于编写可在 Python 2 和 Python 3 下运行的代码。它具有可转换为两个版本的exec_()
功能。我没试过。