用cython

时间:2015-10-13 13:11:02

标签: cython

使用Cython将一些部分从C ++ API包装到python中,我有一些误解,我无法通过搜索类似的问题来解决这个问题。我喜欢访问具有私有构造函数和公共方法GetInstance。

的Factory类
namespace cpplibrary
{
    class CppFactory
    {
    public:
        static CppFactory& GetInstance();
    private:
        CppFactory(void);
        CppFactory( const CppFactory& );
    };
}

我正在尝试像以下一样的cython代码:

cdef extern from "cppFactory.h" namespace "cpplibrary":
    cdef cppclass CppFactory:
        CppFactory() except +
        CppFactory& GetInstance()

cdef class PyFactory:
    cdef CppFactory* _thisptr
    def __cinit__(self):
        self._thisptr = GetInstance()

我已经根据我的想法检查了很多变种。使用和不使用 extern 中的构造函数声明。使用不同的方法从不同的发布示例中定义 _thisptr 。等等。但我无法找到像这样的单身例子。

我无法看到的错误在哪里?

2 个答案:

答案 0 :(得分:1)

我认为你有两个问题:

1)如何包装静态方法:the recommended way是在类外声明函数,并使用字符串告诉Cython它应该在C ++中使用什么名称

2)分配到 int j=0,len; for(int k=0;a[k]!='\0';k++) // loop until a[k] is not '\0' { j++; // increment j (at last gives length of string ) } len=j; // initialize len with value of j for(i=0;i<len;i++){ // loop from i to len if(s[i]==s[j]){ // compare value at index i and len // do something } j--; // decrement j } ,您只需要使用thisptr从引用中获取指针。

代码:

&

答案 1 :(得分:1)

其中一个问题确实是包装一个静态方法(这里是@staticmethod)。

你可以使用cython cdef extern from "cppFactory.h" namespace "cpplibrary": cdef cppclass CppFactory: @staticmember CppFactory& GetInstance() 装饰器来做到这一点(参见Cython&#39; doc update):

cdef class PyFactory:
    cdef CppFactory* _thisptr
    def __cinit__(self):
        self._thisptr = new CppFactory()

然后,.pyx可以是:

var m = item["str"].replace(/[^a-zA-Z0-9 ]/g," ").trim().split(" ");
console.log("count: " + m.length + " words: " + m);