簡體   English   中英

Cython:python類包裝器中的模板

[英]Cython: templates in python class wrappers

有沒有辦法為包含模板的Cython包裝的C ++類創建Python包裝器? (即完全按照此處顯示但使用模板: http//docs.cython.org/src/userguide/wrapping_CPlusPlus.html#create-cython-wrapper-class )。

我知道融合類型的解決方法( https://groups.google.com/forum/#!topic/cython-users/qQpMo3hGQqI )但是這不允許你實現像vector<vector<int>> :毫無疑問,融合類型沒有遞歸的概念。

改寫

我想要實現的是一個包裝類,如:

cdef extern from "header.h":
    cdef cppclass Foo[T]:
        Foo(T param)
        # ...

創建一個簡單的Python包裝器:

cdef class PyFoo[T]:  # I know the '[T]' can't be here, it's a wish
    cdef Foo[T] *thisptr
    def __cinit__(self, param):
        self.thisptr = new Foo[T](param)
    # ...

我很確定Cython本身並不支持,但也許有人可以想到一個解決方法。 我不是在尋找慣用的或好的例子,我只是想知道這是否可行。

正如你所說,Cython並不真正支持這一點。

我認為到目前為止最簡單的方法是使用字符串替換手動生成一堆Cython文件。 從“foowrapper.pxi.src”文件(您希望的名稱......)開始:

cdef class PyFoo_{T}:
  cdef Foo[{T}] *thisptr
  def __cinit__(self, param):
    self.thisptr = new Foo[{T}](param)
    # etc

接下來,通過一個簡單的程序(也可能是Python)運行它來加載文件,執行字符串替換,並以新名稱再次保存文件。 關鍵是:

output = code.format(T=T) # where T is a string with a C++ class name 
              # e.g. "int" or "std::vector<double>"

(顯然有一些與加載和保存相關的代碼,我已經跳過了懶惰)

然后,在您的Cython文件中,您只需“包含”每個類的生成文件。 Cython中的“include”命令是一個文字文本包含(如C預處理器),並期望一個.pxi文件:

cdef extern from "header.h":
    cdef cppclass Foo[T]:
        Foo(T param)
        # ...

include "foowrapper_int.pxi"
include "foowrapper_vectordouble.pxi
# etc

您必須選擇要在編譯時生成的類,但這是不可避免的(模板是編譯時功能),因此您永遠無法從Python腳本環境動態生成它們,因為相應的C ++類贏了不會被生成。

其他選擇

其他幾個選項值得簡要考慮。 首先,您可以從不依賴於模板參數的基類(比如FooBase )繼承Foo<T> 然后,您將在Cython中包裝FooBase (為您關注的案例生成類似構造函數的函數)。 如果要調用的函數沒有依賴於模板類型的參數,那么這才真正可行。 顯然,這也涉及更改C ++代碼。

部分選項是查看不同的包裝方式。 Boost Python肯定會支持這種本地(但它有自己的缺點)。 我想SIP / SWIG也會應付(但我不知道)。 如果需要,您可以將這些與Cython進行相當干凈的混合匹配(通過導入包含模板類的生成模塊)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM