在C中检查PyObject是否为Cython函数

时间:2018-09-05 17:15:58

标签: cython

我已经在C ++应用程序中嵌入了Python 2.7,并使用Cython将一些模块从纯python编译为c,然后编译为共享对象。

Cython编译的模块函数的类型与python pure函数完全不同。

type(func) # <type 'cython_function_or_method'>

是否可以使用Python C-API检查类似PyList_Check的类型。 还是Cython提供像Python.h这样使用的C-api接口?

谢谢

1 个答案:

答案 0 :(得分:2)

Cython函数的类型为PyCFunction,而不是通常的纯Python函数类型的PyFunction(名称中缺少C会有所不同!)。

因此,您可以使用PyCFunction_Check检查手边的功能是否可能是Cython功能。

CPython提供了许多功能,可以通过from cpython cimport XXXX进行导入。但是,并非所有功能都被包装,PyCFunction_Check也没有包装。

但这不是问题,因为它可以轻松地从Python.h导入:

%%cython
cdef extern from "Python.h":
    int PyCFunction_Check(object obj)

def is_cython_function(obj):
    return PyCFunction_Check(obj)!=0

这有点脏,因为PyCFunction_Check是一个定义而不是一个函数,但是它仍然可以工作。

现在:

def dummy():
    pass

is_cython_function(dummy)   #  False
is_cython_function(is_cython_function) # True

但是,函数“ is_cython_function”的名称有些误导-每个内置函数的名称都为True

is_cython_function(abs)  # True

但是,通常您对函数来自cython并不感兴趣,但是函数是否属于PyCFunction类型(顺便说一下,对我来说type(is_cython_function)说:“ {{1} }”。