我在应用程序中嵌入了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'>
"。