我已经在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接口?
谢谢
答案 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} }”。