Cython 函数的类型为 PyCFunction,而不是类型为 PyFunction 的普通纯 Python 函数(名称中缺少 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) 说:“<type 'builtin_function_or_method'>”。