現在見えるCythonコードがいくつかあります
exc = sys.exc_info()
raise exc[0], exc[1], exc[2]
「タプルからのレイズ」フォームが許可されなくなったため、これは Python3 では機能しません。これが通常の Python コードであれば、単に を使用しますsix.reraise
が、ここでは使用できません。Python2とPython3の両方で機能する、同じことを行うためのCythonフレンドリーな方法は何ですか?
現在見えるCythonコードがいくつかあります
exc = sys.exc_info()
raise exc[0], exc[1], exc[2]
「タプルからのレイズ」フォームが許可されなくなったため、これは Python3 では機能しません。これが通常の Python コードであれば、単に を使用しますsix.reraise
が、ここでは使用できません。Python2とPython3の両方で機能する、同じことを行うためのCythonフレンドリーな方法は何ですか?
Cython の優れた機能の 1 つは、生成された C コードを Python 2 または Python 3 用にコンパイルできることです。したがって、上記の例は、変更されていない Python のいずれのバージョンでも動作します。
Cython に、Python 2 の構文とセマンティクス (-2
デフォルトでオンになっている引数) を想定してコードをコンパイルするか、Python 3 (-3
引数) を想定してコードをコンパイルするように指示できます。どちらの場合でも、動的コンポーネント (インポートなど) に互換性がある限り、結果として得られる拡張モジュールのソース コードをコンパイルして Python 2 または Python 3 で使用できます。
例えば:
def raises_exception():
raise KeyError("what you doin'?")
def foobar():
try:
raises_exception()
except Exception:
import sys
exc = sys.exc_info()
raise exc[0], exc[1], exc[2]
setup.py
Py2 または Py3 で動作するa は次のとおりです。
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("reraise.pyx"))
どちらのバージョンの Python でも実行できpython setup.py build_ext -i
(それぞれに cython がインストールされている場合)、作成された拡張モジュールは機能します。
$ python setup.py build_ext -i # Py3 python
$ ipython3
Python 3.3.2 (v3.3.2:d047928ae3f6, Oct 4 2013, 15:49:17)
Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import reraise
In [2]: reraise.foobar()
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-2-9e20eacfd84e> in <module>()
----> 1 reraise.foobar()
/.../reraise.so in reraise.foobar (reraise.c:916)()
/.../reraise.so in reraise.foobar (reraise.c:847)()
/.../reraise.so in reraise.raises_exception (reraise.c:762)()
KeyError: "what you doin'?"
In [3]: