2017-03-08 34 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 
相关问题