如果PyObject是Cython函数,请在C中进行检查 我在C++应用程序中嵌入了Python 2.7,并使用Cython将几个模块从纯Python编译成C,然后将其编译成共享对象。

如果PyObject是Cython函数,请在C中进行检查 我在C++应用程序中嵌入了Python 2.7,并使用Cython将几个模块从纯Python编译成C,然后将其编译成共享对象。,cython,Cython,Cython编译的模块函数与python纯函数的类型完全不同 type(func) # <type 'cython_function_or_method'> type(func)# 是否有一种方法可以使用Python C-API检查该类型,如PyList\u check。 或者Cython是否提供了一个C-api接口,可以像Python.h一样使用 谢谢Cython函数的类型是PyCFunction,而不是像通常的纯Python函数那样的类型PyCFunction(名称中缺少C会

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

type(func) # <type 'cython_function_or_method'>
type(func)#
是否有一种方法可以使用Python C-API检查该类型,如
PyList\u check
。 或者Cython是否提供了一个C-api接口,可以像Python.h一样使用


谢谢

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

因此,您可以使用
PyCFunction\u Check
检查手头的函数是否可能是Cython函数

type(func) # <type 'cython_function_or_method'>
CPython有很多功能,可以通过
从CPython cimport XXXX导入。但是,并非所有功能都已包装,也不是
PyCFunction\u 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\u Check
是一个define而不是一个函数,但它仍然可以工作

现在:

def dummy():
    pass

is_cython_function(dummy)   #  False
is_cython_function(is_cython_function) # True
但是,函数名“
是”cython“函数
”有点误导性-对于每个内置函数,它都是
真的

is_cython_function(abs)  # True
但是,通常您对函数是否来自cython并不感兴趣,而是对它是否属于类型
PyCFunction
感兴趣(顺便说一句,对于我来说
type(is\u cython\u function)
说:“