Python 2 と Python 3 の両方と互換性のある例外再発生コードを書くにはどうすればいいですか? 質問する

Python 2 と Python 3 の両方と互換性のある例外再発生コードを書くにはどうすればいいですか? 質問する

私は WSGI サーバーの実装を Python 2 と Python 3 の両方と互換性のあるものにしようとしています。次のようなコードがありました:

def start_response(status, response_headers, exc_info = None):
    if exc_info:
        try:
            if headers_sent:
                # Re-raise original exception if headers sent.
                raise exc_info[0], exc_info[1], exc_info[2]
        finally:
            # Avoid dangling circular ref.
            exc_info = None
    elif headers_set:
        raise AssertionError("Headers already set!")

    headers_set[:] = [status, response_headers]
    return write

...関連する部分は次のとおりです:

# Re-raise original exception if headers sent.
raise exc_info[0], exc_info[1], exc_info[2]

Python 3 ではこの構文はサポートされていないため、次のように変換する必要があります。

raise exc_info[0].with_traceback(exc_info[1], exc_info[2])

問題: Python 2 の構文は Python 3 で解析エラーを生成します。Python 2 と Python 3 の両方で解析できるコードを書くにはどうすればよいでしょうか? 次のことを試しましたが、うまくいきません。

if sys.version_info[0] >= 3:
    raise exc_info[0].with_traceback(exc_info[1], exc_info[2])
else:
    eval("raise exc_info[0], exc_info[1], exc_info[2]; 1", None, { 'exc_info': exc_info })

ベストアンサー1

使えるsix? まさにこの問題を解決するために存在します。

import six, sys
six.reraise(*sys.exc_info())

見る:https://six.readthedocs.io/index.html#six.reraise

おすすめ記事