2017-02-20 104 views
0

我有這樣一個用Cython功能用Cython功能:ctypedef使用默認參數

cdef void foo(int a, int b=1, int c=2): 
    pass 

和getter函數返回其地址:

def get_foo(): 
    return <size_t>foo 

這樣我就可以得到功能foo的地址某處並將其轉換回cython中的真實函數(例如:可以在python中使用的回調函數)。

問題是如何編寫這樣的類型?

我想:

cdef void foo(int a, int b=1, int c=2): 
    pass 
ctypedef void (*foo_type)(int a, int b, int c) 
cdef foo_type f = foo 

這不會編譯,用Cython抱怨:不能類型 '無效(INT,結構__pyx_opt_args_46_cython_magic_49f265438c694830523a60bef4fe2ee8_foo * __ pyx_optional_args)' 分配給 'foo_type'

從錯誤mesage,可以注意到,選項(默認)參數被cython封裝在一個結構中。

有沒有辦法在cython中做這樣的ctypedef?如果不是這樣,我想我應該離開了默認值:-(

回答

0

您可以創建小包裝沒有默認值:

cdef void foo_abc(int a, int b, int c): 
    foo(a,b,c) 

# if you need it 
cdef void foo_ab(int a, int b): 
    foo(a,b) 
# etc 

這將是對可轉換函數指針:

cdef foo_type f = foo_abc 

從包裝函數的速度損失會很小,因此主要成本只是你需要寫多一點的代碼。

+0

感謝您的回答,這是一個可行的辦法。最後,我想出了函數指針不能提供的默認參數,並且這個類型沒有考慮默認參數,這實際上是c/C++部分的一個問題。我有一個帶有很多參數的函數,其中大部分都有一個默認值,爲了方便起見,添加這麼多的包裝器會很枯燥,因此在c/cython部分中省略默認值並將其留給python部分對我來說會更好畢竟,它是一個python擴展名:-D – oz1