сортировка от py до c и от c до py - PullRequest
0 голосов
/ 21 октября 2011

В cython сортировка типов типа int или char выполняется автоматически, но если я использую

       cdef struct MyClass_Tag:
            pass
      ctypedef MyClass_Tag* MyClass_ptr
      ....
      cdef class MyClass:
           cdef MyClass_ptr obj
           ....

Теперь для переноса любой функции, например, в c, есть функция foo, которая принимает

      foo(char* , MyClass_ptr self)
           #return stuff

Чтобы обернуть эту функцию, я делаю:

       def py_foo(char* n, self):
            return foo(n,self.obj)

Итак, от py до c:

       char is done automatically
       but self is of type MyClass so to call the foo i have to write self.obj , 
       so i pass the same obj

здесь, где происходит сортировка от пи до с

Проблема в том, что я не понимаю, где происходит сортировка от c до py, Я имею в виду, в какой момент это происходит?

Даже в этом случае или даже если вы приведете мне какой-то другой пример, все будет в порядке. Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Поскольку имя параметра self предполагает, что функция C foo() может иметь больше смысла как метод в Python:

cdef extern void c_foo "foo" (char* n, MyClass_ptr)

cdef class MyClass:
   cdef MyClass_ptr this

   def foo(self, unicode n not None):
       b = n.encode('ascii')
       cdef char* p = b
       c_foo(p, self.this)

См. Также Обтекание библиотеки C .

Cython переводит ваш код в C (или C ++).В этот момент вы можете забыть о его существовании.Сгенерированный C-код - это обычное C-расширение для Python.Этот код содержит обычные вызовы Python C API, такие как PyBytes_AsString() (преобразование Python bytes в char*) или PyInt_FromLong() (преобразование C int в целое число Python).

MyClass_ptr используется как есть:

struct __pyx_obj_3foo_MyClass {
  PyObject_HEAD
  MyClass_ptr this; /* <-- using MyClass_ptr as is */
};

т.е. чистый код Python никогда не видит его, поэтому нет преобразования из / в объекты Python.

0 голосов
/ 04 ноября 2011

Я не полностью понял ваш вопрос, но вы можете использовать команду:

cython -a <yourfile.pyx>

Затем откройте сгенерированный с помощью веб-браузера.Вы увидите, как cython перевел ваш код на C, а затем нашел ответы:)

...