如果PyObject是Cython函数,请在C中进行检查 我在C++应用程序中嵌入了Python 2.7,并使用Cython将几个模块从纯Python编译成C,然后将其编译成共享对象。
Cython编译的模块函数与python纯函数的类型完全不同如果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会
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)
说:“
”