Cython总是向编译失败传递方法leeds

2024-04-24 23:58:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把我的应用程序改写成cython。现在,当我尝试将我的cdef方法作为参数传递给另一个参数时,我遇到了问题。我总是会出错:无法通过编译将“f\u type”转换为Python对象,但下面是我的代码:

你知道吗交叉方法.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)

你知道吗交叉方法.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)

这也成功地编译了,但是

你知道吗扁平磅.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:

你知道吗扁平件.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。你知道吗

谨致问候, 阿德里安


Tags: selfobjecttypeitemsfoldlistgraphint