Ale*_*nor 5 exception python-2.x cython python-3.x six-python
我有一些目前看起来的Cython代码
exc = sys.exc_info()
raise exc[0], exc[1], exc[2]
Run Code Online (Sandbox Code Playgroud)
这在Python3上不起作用,因为不再允许"从元组中提升"形式.如果是这个普通的Python代码,我会使用six.reraise
,但这在我这里不可用.什么是Cython友好的方式来做同样的事情,它适用于Python2和Python3?
Cython 的一个重要功能是生成的 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]
Run Code Online (Sandbox Code Playgroud)
这是setup.py
适用于 Py2 或 Py3 的:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("reraise.pyx"))
Run Code Online (Sandbox Code Playgroud)
我可以python setup.py build_ext -i
在任一版本的 Python 上运行(前提是我为每个版本安装了 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]:
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
340 次 |
最近记录: |