Cython - 传递方法总是会导致编译失败

时间:2014-08-21 19:36:43

标签: python cython

我正在尝试将我的应用程序重写为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。

此致 阿德里安

0 个答案:

没有答案