1

このようなコンテキスト マネージャーがあるとします。これは Python 2.X で動作し、終了時にトレースバックを保持します。

class MyContextManager(object):
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        raise AssertionError("Failed :-/"), None, traceback

Python 3 では raise は構文エラーですが、パラメータを設定するだけでよいと思います__traceback__

def __exit__(self, exc_type, exc_value, traceback):
    e = AssertionError("Failed :-/")
    e.__traceback__ = traceback
    raise e

Python 2 と Python 3 の両方と互換性のある (つまり、どちらでも構文エラーを生成しない) トレースバックを保持する方法はありますか? 私はこの時点でやや立ち往生しています。2.6、2.7、3.2、および 3.3 で動作する必要があります。目標は、ユーザーがまだ以前のトレースバックを確認できるようにすることです。

4

1 に答える 1

1

( Ned Batchelder の Python 3 互換性に関するガイド に触発された) 醜いが実行可能な答えの 1 つは、Python 2 の場合にのみ構文違反コードを評価する関数を作成することです。

if sys.version_info[0] == 2:
   s = """
def raise_with_traceback(exc, traceback):
    raise exc, None, traceback
"""
   exec (s)
else:
   def raise_with_traceback(exc, traceback):
       raise exc.with_traceback(traceback)

with_traceback[ Python 3 で優先されることについて @user2357112 に感謝します]。

于 2013-09-01T05:01:21.813 に答える