Функции 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'>
".