我正在尝试将我的应用程序重写为cython。当我尝试将我的cdef方法作为参数传递给另一个时,我坚持了下来。我总是变成错误:无法通过编译将'f_type'转换为Python对象,但这是我的代码:
CrossValMethods.pxd:
cdef class CrossValMethods:
'''
classdocs
'''
cdef list flatCrossVal(self, list items, int numberOfFolds, graph, int nrOfNodes,
defaultClassMat, int lbpSteps, float lbpThreshold, object k_fold_cross_validation,
object separationMethod, object lbp, list layerWeights, isRandomWalk, object adjMatPrep,
object prepareLayers, object prepareClassMat)
CrossValMethods.pyx:
cdef class CrossValMethods:
'''
classdocs
'''
def __cinit__(self):
'''
Constructor
'''
cdef list flatCrossVal(self, list items, int numberOfFolds, graph, int nrOfNodes,
defaultClassMat, int lbpSteps, float lbpThreshold, object k_fold_cross_validation,
object separationMethod, object lbp, list layerWeights, isRandomWalk, object adjMatPrep,
object prepareLayers, object prepareClassMat):
...
code
...
这通常会编译
LPBTools.pxd:
cimport graph.method.lbp.CrossValMethods as cvm
ctypedef list (*f_type)(cvm.CrossValMethods, list, int, object, int, object, int, float, object, object, object, list, object, object, object, object)
cdef class LBPTools:
'''
classdocs
'''
cdef list crossVal(self, items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
k_fold_cross_validation, separationMethod, lbp, layerWeights, f_type crossValMethod, isRandomWalk, adjMarPrep, prepareLayers, prepareClassMat)
LBPTools.pyx:
cdef class LBPTools:
def __cinit__(self):
'''
Constructor
'''
cdef list crossVal(self, items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
k_fold_cross_validation, separationMethod, lbp, layerWeights, f_type crossValMethod, isRandomWalk, adjMarPrep, prepareLayers, prepareClassMat):
return crossValMethod(cvm.CrossValMethods(), items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold, k_fold_cross_validation, separationMethod, lbp, layerWeights, isRandomWalk, adjMarPrep, prepareLayers, prepareClassMat)
这也成功编译,但
FlatLBP.pxd:
cimport graph.method.lbp.CrossValMethods as cvm
ctypedef list (*f_type)(cvm.CrossValMethods, list, int, object, int, object, int, float, object, object, object, list, object, object, object, object)
cdef class FlatLBP:
FlatLBP.pyx:
ctypedef list (*f_type)(crossValMethods.CrossValMethods, list, int, object, int, object, int, float, object, object, object, list, object, object, object, object)
cdef class FlatLBP:
def __cinit__(self):
'''
Constructor
'''
cdef list start(self, graph, int nrOfNodes, np.ndarray defaultClassMat, int nrOfClasses, int lbpSteps, float lbpThreshold, int numberOfFolds):
cdef list fold_sum = []
cdef int i
for i in range(1,nrOfNodes+1,1):
fold_sum.append([i,0,0])
cdef int fold_number = 1
cdef list items = range(nrOfNodes)
cdef float timer = time.time()
cdef np.ndarray fuz_mean_occ = np.array([])
cdef crossValMethods.CrossValMethods method = crossValMethods.CrossValMethods()
cdef f_type methodToPass = method.flatCrossVal
lbp = LoopyBeliefPropagation()
#TODO add tzpe when changed to cdef class
tools = tool.LBPTools(nrOfNodes, graph, defaultClassMat, lbpSteps, lbpThreshold)
fold_sum = tools.crossVal(items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
tools.k_fold_cross_validation, self.prepareFoldClassMat,
lbp.lbp, None, methodToPass, False, None, None, None)
这里编译错误:
Error compiling Cython file:
------------------------------------------------------------
tools = tool.LBPTools(nrOfNodes, graph, defaultClassMat, lbpSteps, lbpThreshold)
fold_sum = tools.crossVal(items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
tools.k_fold_cross_validation, self.prepareFoldClassMat,
lbp.lbp, None, methodToPass, False, None, None, None)
^
------------------------------------------------------------
FlatLBP.pyx:66:50: Cannot convert 'f_type' to Python object
好的,我知道符号很糟糕,而且代码非常混乱。 我只想知道有没有办法将cdef方法作为参数传递或者总是将它转换为python对象?如果有办法,我做错了什么? 我将非常感激任何帮助。 我没有任何C经验,我主要是Java人,有人要我使用python然后使用cython。
此致 阿德里安