Проверьте в C, если PyObject является функцией Cython - PullRequest
0 голосов
/ 05 сентября 2018

Я встроил Python 2.7 в приложение C ++ и использовал Cython для компиляции нескольких модулей из чистого python в c, а затем в общие объекты.

Ну, функции модуля, скомпилированные Cython, имеют совершенно другой тип, чем функция Python pure.

type(func) # <type 'cython_function_or_method'>

есть ли способ проверить этот тип, например PyList_Check, используя Python C-API. Или Cython предоставляет интерфейс C-api, который будет использоваться как Python.h?

Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

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

...