将cython扩展类导入python文件(位置参数

时间:2017-04-04 20:31:59

标签: python cython

我有两个文件:run.py和constraints.pyx。我想在constraints {pyx]中的this code中创建一个类似于L1Penalty的扩展类,并在run.py中实例化它以在函数中使用。

我做了什么:

constraints.pyx包含一个扩展类,this code中Penalty类的子类:

from lightning.impl.sag_fast cimport Penalty

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

在run.py中我创建了一个ProbaPenalty实例:

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

我遇到的错误是:

  

cinit ()只需1个位置参数(0给定)

是否有一个粗心的错误?我无法在stackoverflow上找到类似的问题。 我试着改变我的cinit以接受一个bint support_lagged,以便我现在有

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

然后使用

pen = ProbaPenalty(0)

这一次,我收到错误:

  

AttributeError:' custom_constraints.ProbaPenalty'对象没有属性' b'

我在哪里打电话给b,b甚至来自哪里?

一开始,我希望ProbaPenalty有一个双打b的向量,我做了cinit(self,double * b),但我已经改变了代码,删除了.c和.so文件等,查看当前的.c文件,也没有属性b。

我也尝试使用setup.py进行编译,遇到同样的问题。

1 个答案:

答案 0 :(得分:0)

__cinit__方法不适合对扩展类型进行Python级访问,请参阅http://docs.cython.org/en/latest/src/reference/extension_types.html

定义一个reguar __init__供Python使用。