Cython cdef类不显示文档字符串或__init__参数 [英] Cython cdef Class not displaying doc string or __init__ parameters

查看:83
本文介绍了Cython cdef类不显示文档字符串或__init__参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用cdef定义了一个python类,该类用Cython包装了一个C ++类,并且可以正常工作。但是,当我在python或class中使用help(class)时?在ipython中,我得到如下内容:

I have used cdef to define a python class which wraps a C++ class with Cython and it works correctly. However when I use help(class) in python or class? in ipython I get something like the following:

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

我不希望显示任何文档字符串或init签名,如何显示它?

Which does not display any doc-string or init signature, which I would like to have displayed, how could I get it to display this?

Cython包装器如下所示:

The Cython wrapper is as follows:

TestClass.pyx

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 ++代码lo可以这样:

and the C++ code looks like so:

TestClassC.cpp

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;
}


推荐答案

解决方法是按照oz1的建议进行操作,并将 embedsignature 伪指令设置为 True ,并添加普通的python __ init __ 函数是这样的:

The way to solve this was to do as was suggested by oz1 and set the embedsignature directive to True and also to add a normal python __init__ function like so:

@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

然后将init签名自动包含在文档字符串中,如下所示:

Then the init signature is included in the docstring automatically like so:

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

这篇关于Cython cdef类不显示文档字符串或__init__参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆