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



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

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

type(func) # <type 'cython_function_or_method'>

有没有办法像使用 Python C-APIPyList_Check一样检查该类型。 还是Cython提供了一个像Python.h一样使用的C-api接口?

谢谢

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不感兴趣,而是对is是否属于PyCFunction类型感兴趣(顺便说一句,对我来说type(is_cython_function)说:"<type 'builtin_function_or_method'>"。

相关内容

最新更新