我有两个文件: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进行编译,遇到同样的问题。
答案 0 :(得分:0)
__cinit__
方法不适合对扩展类型进行Python级访问,请参阅http://docs.cython.org/en/latest/src/reference/extension_types.html
定义一个reguar __init__
供Python使用。