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(其中 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 * 造成过多的命名空间污染,你可能会创建一个只包含运算符而不包含 class 定义的 pxd 文件(虽然我还没有测试过这个)

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