Я нашел несколько вариантов для этого, прежде чем Антти опубликовал свой ответ о том, что Python 2 поддерживает Python 3 синтаксис функции exec.
Первое выражение также может быть кортежем длины 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)
Exec в Eval
Нед Бэтчелдер опубликовал метод, заключающий оператор 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"
))
Шесть пакетов
Пакет six представляет собой библиотеку совместимости для написания кода, который будет работать как на Python 2, так и на Python 3. В нем есть функция exec_()
, которая транслируется в обе версии. Я не пробовал.
person
Don Kirkby
schedule
09.10.2012
exec
- person Antti Haapala   schedule 12.03.2016