2017-03-08 51 views
1

我已經使用CDEF定義Python類它包裝與用Cython C++類和它工作正常。但是,當我在Python或類中使用幫助(類)?在IPython中我得到類似如下:用Cython CDEF類未顯示文檔字符串或__init__參數

>>> TestClass.CTestClass? 
Init signature: TestClass.CTestClass() 
Docstring:  <no docstring> 
File:    ~/Coding/CythonWithCppTutorials/ClassCythonCPPWithMemberFunctions/TestClass.so 
Type:   type 

它不顯示任何文檔字符串或init簽名,我想有顯示的,我怎麼能拿它來顯示這個?

的用Cython包裝如下:

TestClass.pyx

import cython 
import numpy as np 
cimport numpy as np 

cdef extern from "TestClassC.cpp": # defines the source C++ file 
    cdef cppclass TestClass: # says that there is a class defined in the above C++ file called TestClass 
     TestClass(int Dimensionality, double* InputArray) # the class has public member function TestClass which takes some arguments 
     double SumListOfNumbers() # the class has a public member function which returns a double and has no arguments 
     int Dimensionality # the class has a public variable that is an integer and is called Dimensionality 
     double* ListOfNumbers # the class has another public variable that is a pointer to a double 

cdef class CTestClass: # defines a python wrapper to the C++ class 
    """ 
    This is a test class wrapper for c++. 
    """ 
    cdef TestClass* thisptr # thisptr is a pointer that will hold to the instance of the C++ class 
    def __cinit__(self, int Dimensionality, np.ndarray[double, ndim=1, mode="c"] InputArray not None): # defines the python wrapper class' init function 
     cdef double[::1] InputArrayC = InputArray # defines a memoryview containnig a 1D numpy array - this can be passed as a C-like array by providing a pointer to the 1st element and the length 
     self.thisptr = new TestClass(Dimensionality, &InputArrayC[0]) # creates an instance of the C++ class and puts allocates the pointer to this 
    def __dealloc__(self): # defines the python wrapper class' deallocation function (python destructor) 
     del self.thisptr # destroys the reference to the C++ instance (which calls the C++ class destructor 
    def CSumListOfNumbers(self): 
     return self.thisptr.SumListOfNumbers() 

和C++代碼看起來像這樣:

TestClassC.cpp

#include <iostream> 

class TestClass{ 
public: 
    TestClass(int Dimensionality, double* InputArray); // prototype of constructor 
    ~TestClass(void); // prototype of destructor 
    double SumListOfNumbers(void); 
    int Dimensionality; 
    double* ListOfNumbers; 
}; 

TestClass::TestClass(int DIM, double* InputArray) 
{ 
    Dimensionality = DIM; 
    std::cout << Dimensionality << "\n"; 
    ListOfNumbers = new double[Dimensionality]; 
    for (int i = 0; i < Dimensionality; ++i) { 
    ListOfNumbers[i] = InputArray[i]; 
    std::cout << ListOfNumbers[i] << ", "; 
    } 
    std::cout << "\n"; 
}; 

TestClass::~TestClass(void){ 
    std::cout << "Being Destroyed" << "\n"; 
}; 

double TestClass::SumListOfNumbers(void){ 
    double Sum = 0; 
    for (int i = 0; i < Dimensionality; ++i) { 
    Sum += ListOfNumbers[i]; 
    } 
    return Sum; 
} 
+0

將用Cython編譯器指令'embedsignature'來'真'。請參閱[DOC](http://docs.cython.org/en/latest/src/reference/compilation.html#compiler-directives) – oz1

+0

@SomeRandomPhysicist在一個更切下來測試用例與用Cython 0.25.2它適用於我。我知道這對你沒什麼幫助 – DavidW

+0

將編譯器指令embedignature設置爲true對於docstring有效,但它不設置Init簽名。 – SomeRandomPhysicist

回答

1

的方式來解決這個問題的方法是按照oz1的建議進行,並將embedsignature指令設置爲True並且還增加一個普通的Python __init__功能,像這樣:

@cython.embedsignature(True) 
cdef class CTestClass: # defines a python wrapper to the C++ class 
    """ 
    This is a test class wrapper for c++. 
    """ 
    def __init__(self, Dimensionality, InputArray): 
     pass 

    cdef TestClass* thisptr # thisptr is a pointer that will hold to the instance of the C++ class 


    def __cinit__(self, int Dimensionality, np.ndarray[double, ndim=1, mode="c"] InputArray not None): # defines the python wrapper class' init function 
     cdef double[::1] InputArrayC = InputArray # defines a memoryview containnig a 1D numpy array - this can be passed as a C-like array by providing a pointer to the 1st element and the length 
     self.thisptr = new TestClass(Dimensionality, &InputArrayC[0]) # creates an instance of the C++ class and puts allocates the pointer to this 

,隨後的初始化簽名包含在文檔字符串像自動所以:

In [1]: import TestClass 

In [2]: TestClass.CTestClass? 
Init signature: TestClass.CTestClass(self, /, *args, **kwargs) 
Docstring: 
CTestClass(Dimensionality, InputArray) 

This is a test class wrapper for c++. 
File:   ~/Coding/CythonWithCppTutorials/ClassCythonCPPWithMemberFunctions/TestClass.so 
Type:   type