2014-09-25 34 views
1

我的C++頭文件的某些部分:用Cython定義void函數基C++頭

virtual void OnFrontDisconnected(int nReason){}; 

我.pxd文件的一些聲明:

void OnFrontDisconnected(int nReason) except + 

關於我.pyx文件中的代碼:

cpdef void OnFrontDisconnected(self, int nReason) except +: 
    self._this_md_spi.OnFrontDisconnected(nReason) 

但是當我嘗試編譯代碼,但我得到一些錯誤:
Cannot convert 'void' to Python object
Return with value in void function

我沒有在代碼中提供return

我應該在代碼中刪除void關鍵字嗎?

回答

1

首先,您不能有void返回cpdef; Python調用者需要返回一些東西,void不是None。只留下退貨價值並給予適當的回報。

但是請注意,您有一個更大的潛在問題。通過編寫

# In your case, CType == void, but would have 
# to be something convertible like int in order 
# for it to compile. 
cpdef CType function() except +: 
    other_function() # also except + 

你有禁用所有正確的錯誤處理!

內部函數中的except +會將其C++異常轉換爲Python異常。當Python異常拋出function,時,將不會找到,因爲它只查找C++異常。您應該做的:

cpdef CType function() except +: 
    other_function() # NOT except + 

cpdef CType function() except *: 
    other_function() # except + 

cpdef function(): 
    other_function() # except + 

第三是因爲不指定返回類型,給它一個Python的返回類型,這是自動處理妥當。


我敢打賭,你沒有想到它是這個複雜的;)。