Почему мой класс в Cython отображается как Python код в аннотации? - PullRequest
1 голос
/ 25 апреля 2020

Я начал изучать Cython как способ ускорить некоторый код. Одна вещь, которую я хотел бы сделать, это создать класс Cython, который представляется в виде структуры, чтобы помочь создать чистый код.

У меня есть следующая структура папок:
+ test_package
+ - a.pxd
+ - a.pyx
+ setup.py

a.pxd:

from libc.stdint cimport uint8_t

cdef class ClassA:
    cdef readonly:
        uint8_t a_attribute
        uint8_t b_attribute
        uint8_t c_attribute

    cdef uint8_t get_a(self)
    cdef uint8_t get_b(self)
    cdef uint8_t get_c(self)

a.pyx:

from libc.stdint cimport uint8_t

cdef class ClassA:
    def __cinit__(self):
        self.a_attribute = 0x00
        self.b_attribute = 0x01
        self.c_attribute = 0x02

    cdef uint8_t get_a(self):
        return self.a_attribute

    cdef uint8_t get_b(self):
        return self.b_attribute

    cdef uint8_t get_c(self):
        return self.c_attribute

cdef ClassA make_ClassA():
    cdef ClassA A = ClassA()
    A.a_attribute = 0x12
    return A

setup.py:

from setuptools import Extension, setup
from Cython.Build import cythonize


extensions = [Extension("test_package", ['test_package/*.pyx'])]

setup(
    ext_modules=cythonize(extensions, annotate=True),
    compiler_directives={'language_level' : "3"},
)

Я могу запустить python3.7 setup.py build_ext --inplace, чтобы построить это. Когда я смотрю на a.html, я вижу что-то вроде этого:

a.html

Есть ли причина, по которой он преобразуется в Python объекты? Например:

self.a_attribute = 0x00
  if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_a_attribute, __pyx_int_0) < 0) __PYX_ERR(1, 5, __pyx_L1_error)

может ссылаться на __pyx_v_self, но все равно преобразует его в Python объект. Я могу заставить многие свои методы скомпилировать код C, но меня больше всего беспокоит что-то вроде этого:

enter image description here

i, j, k циклы компилируются в C, но доступ к переменной struct по-прежнему является ссылкой на объект Python.

Другой вариант - я могу сделать что-то вроде этого:

enter image description here

Но, очевидно, это все равно будет отображаться как Python код, основанный на всем, что я показал выше. Так почему это? Я неправильно использую cdef class или это только то, что происходит при доступе к атрибутам cdef class?

...