2017-04-04 84 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时,有一些保存的变量没有被清除。 –