Возникла проблема с Pyrex/Cython, похоже это баг.
Из cdef void bar метода вызываю cdef void* foo метод (функцию), результат сохраняю в локальных переменных или еще где, это не имеет значения. foo выполнен в двух видах, как функция (не привязан к классу) и как метод класса. Оба метода foo компилируются в ожидаемый C-код, т.е. нет никакого упоминания PyObject, обычный C. Первый foo из bar вызывается нормально и результат присваевается чему надо, а вот со вторым проблема. Второй метод bar вызывает как питоновский, т.е. запрашивает его по имени (PyObject_GetAttr) и вызывает (PyObject_Call), что неправильно, в словаре foo просто не будет (на сколько я понимаю). Более того Pyrex/Cython думает (в методе bar), что результат этого метода это PyObject (что не верно) и, естественно, не может преобразовать его к требуемому void*. Напомню, с первым foo проблем нет.
test.pyx:
cdef class A:
cdef void* foo(self):
return NULL
cdef void* foo():
return NULL
cdef void bar(object a):
cdef void* b
b = foo()
b = a.foo()
test.py
#!/usr/bin/env python
from distutils.core import setup
from distutils.extension import Extension
#from Pyrex.Distutils import build_ext
from Cython.Distutils import build_ext
setup(
name = 'test',
ext_modules=[Extension('test', ['test.pyx'])],
cmdclass = {'build_ext': build_ext})
Ошибка:
Error converting Pyrex file to C:
------------------------------------------------------------
...
cdef void bar(object a):
cdef void* b
b = foo()
b = a.foo()
^
------------------------------------------------------------
./test.pyx:16:10: Cannot convert Python object to 'void *'
..bw