AnttiがPython2がPython3exec関数構文をサポートしているという回答を投稿する前に、これを行うためのいくつかのオプションを見つけました。
最初の式は、長さが2または3のタプルの場合もあります。この場合、オプションの部分は省略できます。フォームexec(expr, globals)
はと同等ですがexec expr in globals
、フォームexec(expr, globals, locals)
はと同等exec expr in globals, locals
です。タプル形式のexecは、Python 3との互換性を提供します。ここで、execはステートメントではなく関数です。
何らかの理由でそれを使用したくない場合は、ここに私が見つけた他のすべてのオプションがあります。
スタブのインポート
2つの異なるインポートスタブを宣言し、現在のインタープリターで機能する方をインポートできます。これは、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のExec
Ned Batchelderexec
は、Python 3で構文エラーが発生しないように、ステートメントを呼び出しでラップする手法を投稿しましeval
た。これは賢いですが、明確ではありません。
# 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"
))
6つのパッケージ
6つのパッケージは、Python2とPython3の両方で実行されるコードを記述するための互換性ライブラリです。両方のバージョンに変換するexec_()
関数があります。私はそれを試していません。