cython与typing.NamedTuple兼容吗?



我在temp.py文件中有以下代码

from typing import NamedTuple
class C(NamedTuple):
a: int
b: int
c = C(1, 2)

我用命令编译它:

cythonize -3 -i temp.py

并使用命令

运行它
python3 -c 'import temp'

我得到以下异常:

Traceback (most recent call last):   File "<string>", line 1, in <module>   File "temp.py", line 7, in init temp
c = C(1, 2) TypeError: __new__() takes 1 positional argument but 3 were given

python版本:3.6.15

cython版本:0.29.14

上面的代码/构建步骤有什么问题吗?

它将在当前的Cython 3 alpha版本(以及更高版本)中工作。它在Cython 0.29中不起作用。X(您使用的是相当过时的版本,但这不会影响此功能)。

它要求类有一个__annotations__字典,这是一个在Cython 3 alpha版本中添加的特性。

你不会从编译这是Cython中获得太多/任何速度优势-它仍然会生成一个普通的Python类。但是它会起作用的。

总之,NO,它不兼容。编辑:当前不兼容。

命名元组只是python的魔法(在运行时创建类),cython不知道它,所以你必须在运行时调用解释器来执行该代码,使用exec

# temp.pyx
temp_global = {}
exec("""
from typing import NamedTuple

class C(NamedTuple):
a: int
b: int   
""",temp_global)
C = temp_global['C']
c = C(1,2)
print(c)

测试

import pyximport
pyximport.install()
import temp

这最终是一些python代码,当你导入二进制文件时,整个文件被传递给exec,所以它不是真正的"Cython代码",你可以把它写成一个python.py文件,避免使用Cython,或者只是实现你的"Cython类";不用依靠巨蟒的魔法。(没有命名元组或在运行时创建的动态代码)

最新更新