Cython中的非成员运算符

时间:2015-04-19 16:25:25

标签: cython

我正在为现有的C ++库做一个Cython包装器。我在C ++中有一个重载的非成员运算符,如

Data operator+(Data const& a, Data const& b)

在描述标题的pxd文件中,我写了

cdef extern from 'blabla.h':
    Data operator+(const Data&, const Data&)

现在我如何在另一个operator+文件中使用此pyx

1 个答案:

答案 0 :(得分:4)

对于非常简单的情况,就像在你的例子中你可以欺骗Cython并告诉它运算符是一个成员函数:

cdef extern from 'blabla.h':
  cdef cppclass Data:
    # the rest of the data definitions
    Data operator+(const Data&)

它只使用此信息来了解它可以将代码a+b(其中ab是数据对象)转换为__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 *命名空间污染,你可能会创建一个只包含运算符而不是类定义的pxd文件(我还没有测试过这个)

总之 - 两种方法取决于您的用例的复杂程度......