我需要一个 cython 包装器来存储由三个相同类型元素组成的元组。
现在我知道 cython 不直接支持这一点,但在此处找到的问题的答案中“解释”了一种解决方法:如何在 cython 中声明 c++ 元组
这个答案甚至提供了另一个“解释”的链接,所以我知道我有被指控发布“重复问题”的风险。但是...
问题是我不明白答案,因为它不够明确,可能是因为它比我需要或想要的更抽象。提供了一个小代码片段作为示例。我不知道这个代码片段应该放在哪里,也没有解释如何“导出每个 tupleN”。
我试图在评论中要求更明确的答案,但我不被允许这样做,因为我的声誉还不够高。所以我唯一的办法就是发布这个问题。
所以请假设以下情况,我在我的 C++ 源代码中定义了一个名为
header.h
的标头
typedef std::tuple<double*,double*,double*> Coordinate
在其他地方,我有一个 pxd 文件,我想在其中为此类型创建包装器。所以我想写如下内容:
cdef extern from "<tuple>" namespace "std":
cdef cppclass cppTuple "tuple"[T,T,T]:
tuple()
然后在其他地方我有一个 pyx 文件,它定义了一个带有指向元组的指针的 python 类。像这样说:
cdef class PointType:
cdef cppTuple[double*,double*,double*]* c_PointType_ptr
def __cinit__(self):
self.c_PointType_ptr = new cppTuple()
def __dealloc__(self):
del self.c_PointType_ptr
现在我知道这个细节是错误的。但什么——尽可能明确——才是正确的方法呢?所提供的链接中提供的答案对于我来说还不够明确,无法理解。
顺便说一句:我也不太确定如何处理 typedef,所以如果有人能好心地澄清该怎么做,我真的很感激。
谢谢你。
最简单的事情可能是完全删除模板并仅实现您正在使用的特定类型的元组:
cdef extern from "<tuple>":
cdef cppclass Coordinate "std::tuple<double*, double*, double*>":
Coordinate()
当然,既然你已经有了 typedef,你就可以这样做:
cdef extern from "header_where_you_defined_the_typedef":
cdef cppclass Coordinate:
Coordinate()
这里 Cython 甚至不需要知道它的底层是 C++
std::tuple
。
cdef class
基本上就是你写的:
cdef class PointType:
cdef Coordinate* c_PointType_ptr
def __cinit__(self):
self.c_PointType_ptr = new Coordinate()
def __dealloc__(self):
del self.c_PointType_ptr
Cython 真正需要了解的就是
Coordinate
存在一个名为该类的类。