2017-04-04 111 views
1

我有兩個文件:一個run.py和一個constraints.pyx。我想創建一個類似於this code中的L1Penalty的擴展類,在constraints.pyx中實例化它run.py在函數中使用將python擴展類導入到python文件中(位置參數

我做了什麼:

constraints.pyx包含一個擴展類,處罰類的this code子類:

from lightning.impl.sag_fast cimport Penalty 

cdef class ProbaPenalty(Penalty): 
    def __cinit__(self): 
     self.support_lagged = False 
... 

在運行.py我創建了ProbaPenalty的實例:

import pyximport; pyximport.install() 
from constraints import ProbaPenalty 
pen = ProbaPenalty() 

的錯誤,我有是:

cinit() takes exactly 1 positional argument (0 given)

是否有紕漏?我無法在stackoverflow上找到類似的問題。 我試圖改變我的CINIT採取在賓特support_lagged這樣的,我現在有

cdef class ProbaPenalty(Penalty): 
    def __cinit__(self, bint support_lagged): 
     self.support_lagged = support_lagged 

,然後使用

pen = ProbaPenalty(0) 

這一次,我得到的錯誤:

AttributeError: 'custom_constraints.ProbaPenalty' object has no attribute 'b'

在哪裏我打電話給b嗎?b甚至從哪裏來?

在開始時,我想讓ProbaPenalty具有雙b的向量,並且我做了cinit(self,double * b),但是我已經改變了代碼,刪除了.c和.so文件等。 ,查看當前的.c文件,也沒有屬性b。

我也嘗試編譯與setup.py,同樣的問題。

+0

基於OP評論下的答案我投票結束爲「不能再轉載」 – DavidW

回答

0

__cinit__方法不適合用於Python級訪問的擴展類型,見http://docs.cython.org/en/latest/src/reference/extension_types.html

定義絡__init__從Python的使用。

+0

我實際上嘗試運行我今天早上再次運行什麼,關閉並重新打開spyder後 - 即使使用__cinit__也能運行。 無論如何,它不會解釋爲什麼有一個屬性b。我猜想當我重新運行我的setup.py時,有一些保存的變量沒有被清除。 –