non-member Cython 中的运算符
non-member operator in Cython
我目前正在为现有的 C++ 库做一个 Cython 包装器。我在 C++ 中有一个重载的 non-member 运算符,例如
Data operator+(Data const& a, Data const& b)
并且在描述 header 的 pxd
文件中,我写了
cdef extern from 'blabla.h':
Data operator+(const Data&, const Data&)
现在如何在另一个 pyx
文件中使用这个 operator+
?
对于非常简单的情况,例如在您的示例中,您可以对 Cython 撒谎并告诉它运算符是一个成员函数:
cdef extern from 'blabla.h':
cdef cppclass Data:
# the rest of the data definitions
Data operator+(const Data&)
它只使用此信息知道它可以将代码 a+b
(其中 a
和 b
是数据对象)翻译成 __pyx_v_a + __pyx_v_b
并让 c++编译器完成剩下的工作(因为从 "blabla.h" 导入,它知道该怎么做)。因此,会员和非会员的区别是无关紧要的。
但是:使用非成员运算符的主要原因之一是允许像
这样的事情
Data operator+(int a, const Data& b);
你可以完成这项工作,但有点乱。在你的 pxd 文件中做
cdef extern from 'blabla.h':
Data operator+(int, const Data&) # i.e. do nothing special
在你的 pyx 文件中
from my_pxd_file import * # works fine
## but this isn't accepted unfortunately:
from my_pxd_file import operator+
如果你想避免因执行 import *
造成过多的命名空间污染,你可能会创建一个只包含运算符而不包含 class 定义的 pxd 文件(虽然我还没有测试过这个)
总而言之 - 两种方法取决于您的用例的复杂程度...
我目前正在为现有的 C++ 库做一个 Cython 包装器。我在 C++ 中有一个重载的 non-member 运算符,例如
Data operator+(Data const& a, Data const& b)
并且在描述 header 的 pxd
文件中,我写了
cdef extern from 'blabla.h':
Data operator+(const Data&, const Data&)
现在如何在另一个 pyx
文件中使用这个 operator+
?
对于非常简单的情况,例如在您的示例中,您可以对 Cython 撒谎并告诉它运算符是一个成员函数:
cdef extern from 'blabla.h':
cdef cppclass Data:
# the rest of the data definitions
Data operator+(const Data&)
它只使用此信息知道它可以将代码 a+b
(其中 a
和 b
是数据对象)翻译成 __pyx_v_a + __pyx_v_b
并让 c++编译器完成剩下的工作(因为从 "blabla.h" 导入,它知道该怎么做)。因此,会员和非会员的区别是无关紧要的。
但是:使用非成员运算符的主要原因之一是允许像
这样的事情Data operator+(int a, const Data& b);
你可以完成这项工作,但有点乱。在你的 pxd 文件中做
cdef extern from 'blabla.h':
Data operator+(int, const Data&) # i.e. do nothing special
在你的 pyx 文件中
from my_pxd_file import * # works fine
## but this isn't accepted unfortunately:
from my_pxd_file import operator+
如果你想避免因执行 import *
造成过多的命名空间污染,你可能会创建一个只包含运算符而不包含 class 定义的 pxd 文件(虽然我还没有测试过这个)
总而言之 - 两种方法取决于您的用例的复杂程度...