2015-07-16 5 views
2

В Cython можно передать экземпляр класса Cython cdef в качестве аргумента методу cdef. Например, если у нас есть класс ниже:Передача объекта класса cdef в качестве аргумента в метод cdef

# foo.pyx 
cdef class Foo: 
    def __cinit__(self, double arg): 
     self.arg = arg 

    def get_arg_sqr(self): 
     return self.arg * 2 

# bar.pyx 
from foo cimport Foo 
cdef exec_foo(Foo foo): 
    cdef double sqr = foo.get_arg_sqr() 

Как вы достигаете чего-то подобного?

# test.py 
from foo import Foo 
import bar 
Foo f = Foo(2.33) 
exec_foo(f) 
+0

Я добавил 'cimport foo' в' bar.pyx' благодарность за напоминание. – Bitmap

+0

Это было - отредактировано. Thx – Bitmap

+1

Извините, я неверно разобрал ваш вопрос. IIRC, идея здесь состоит в том, чтобы отделить логику и реализацию, подобно заголовочным файлам в c. Вы можете создавать классы «интерфейса» в файле 'pxd', а затем использовать' cimport' для записи объявлений переменных, таких как 'cdef Foo f'. Фактические реализации затем находятся в файле '.pyx'. – cel

ответ

0

exec_foo должен быть def не cdef если вы хотите получить доступ к нему вне вашего кода Cython. В записной книжке следующее, кажется, работает (без PYD/Pyx файлов)

В своей вступительной клетке

import cython 
%load_ext Cython 

В следующей ячейке:

%%cython 

cdef class Foo: 
    cdef double arg 

    def __cinit__(self, double arg): 
     self.arg = arg 

    def get_arg_sqr(self): 
     return self.arg * 2 

def exec_foo(Foo foo): 
    cdef double sqr = foo.get_arg_sqr() 
    return sqr 

В последней ячейке.

f = Foo(1.0) 
exec_foo(f) 
Смежные вопросы