在Cython中按名称调用cdef函数

tia*_*ago 3 python cython

cdef在Cython中有一堆函数,由文件中的def函数调用pyx,例如:

cdef inline void myfunc_c(...):
    (...)
    return

def wrapper(...):
    myfunc_c(...)
    return
Run Code Online (Sandbox Code Playgroud)

这很好用.但为了简化不必为每个cdef函数都有一个python包装器,我试图cdef通过名称索引函数,或者通过将它们分配给字典或类似的东西:

def wrapper(operation):
    if operation == 'my_func':
        func = myfunc_c
    func(...)
    return
Run Code Online (Sandbox Code Playgroud)

但这不起作用.Cython抱怨说它不知道它的类型myfunc_c.

有没有办法cpdef按名称索引或调用函数(例如使用字符串)?我也尝试了类似的东西locals()['myfunc_c'],但这也不起作用.

Dav*_*idW 5

对于cdef函数来说,这绝对是不可能的 - 它们只定义了C接口而不是Python接口,所以没有内省可用.

cpdef函数定义了Python和C接口.在一个函数中,它们将是可用的globals()而不是locals()(因为locals()它只提供在该函数中定义的变量.)


我实际上并不认为你想这样做.我想你只想使用cpdef而不是cdef因为这会自动为函数生成一个Python包装器.