Подтвердить что ты не робот

Cython: как сделать объект python как свойство класса cython

У меня есть существующий класс python X, и я хочу сделать следующее:

from my_python_module import X
cdef class Y:
    cdef X test

Но это не работает из коробки, cdef принимает только тип C, а не класс Python. Любая работа вокруг?

4b9b3361

Ответ 1

Я не думаю, что вы можете (http://docs.cython.org/src/userguide/sharing_declarations.html#sharing-extension-types), но вы можете обойти его, используя __cinit__, чтобы утверждать, что атрибут имеет правильный тип:

В вашем файле Cython (например, "p.pyx" ):

import my_python_module as q

cdef class Y:
    cdef int i
    cdef public object x  # public so it can be accessed from Python

    def __cinit__(self, x_):
        assert isinstance(x_, q.X)
        self.x = x_

и my_python_module.py - это то, где вы определили свой класс X:

class X(object):
    def __init__(self):
        self.i = 1

Затем вы используете его следующим образом:

import my_python_module as q
import p

y = p.Y(q.X())
print y.x
print y.x.i

Ответ 2

Я бы использовал что-то вроде этого:

cdef class SomeCls:
    cdef object _x

    def __cinit__(self, x_):
        self._x = x_

    property x:
        def __get__(self):
            return self._x
        def __set__(self, x_):
            self._x = x_

Вышеприведенное особенно полезно при экспонировании атрибутов extern-структуры или класса. См. Пример здесь: упаковка С++