Как сохранить имя класса C ++ без изменений с Cython?

У меня есть класс C ++ под названием Foo. Если я буду следовать учебному курсу Cython C ++, мне нужно будет назвать класс Python по-другому, например PyFoo. Однако мне действительно нужно вызвать класс Pooon Foo. Как это сделать эффективно?

Изменить: Я пытаюсь связать существующую библиотеку C ++, ранее связанную с Boost Python. По разным причинам я бы хотел проверить Cython. Поскольку с Boost: классы Python Python вызывались с тем же именем, что и в C ++, я хотел бы продолжить это соглашение об именах. Это не требование Python (CPython), чтобы вызывать классы по-разному, но, похоже, это навязывается Cython, по крайней мере, в учебнике.

Я могу, конечно, использовать чистый модуль python для определения класса Foo, который вызывает PyFoo, но это кажется скучным и неэффективным.

2 Solutions collect form web for “Как сохранить имя класса C ++ без изменений с Cython?”

Есть два способа справиться с этим.

  1. Объявить класс C ++ с альтернативным именем; оригинальное имя должно быть указано в двойных кавычках:

     cdef extern from "defs.h" namespace "myns": cdef cppclass CMyClass "myns::MyClass": ... 

    Затем вы можете использовать MyClass для своего класса python и ссылаться на объявление C ++ как CMyClass .

    Обратите внимание, что исходное имя должно содержать пространство имен явно (если оно находится в пространстве имен). Аргументы шаблона Cython (при наличии) должны идти после объявления альтернативного имени.

  2. Объявите свои классы C ++ в отдельном файле .pxd , именованном иначе, чем ваш .pyx файл, а затем импортируйте их с помощью cimport .

    В cpp_defs.pxd:

     cdef extern from "defs.h" namespace "myns": cdef cppclass MyClass: ... 

    В py_wrapper.pyx:

     cimport cpp_defs as cpp cdef class MyClass: cpp.MyClass *_obj 

Вот полный пример, демонстрирующий подход Никиты:

 cdef extern from "floorplan_geometry.h" namespace "flyby::localize": cdef cppclass CFloorplan "flyby::localize::Floorplan": int xmin() cdef class Floorplan: cdef CFloorplan* obj_ def __cinit__(self): self.obj_ = new CFloorplan() def __dealloc__(self): del self.obj_ def xmin(self): return self.obj_.xmin() 
  • Код Numba медленнее, чем чистый питон
  • Как освободить типизированный массив numpy? Устанавливает ли callback_free_data жизнеспособный вариант?
  • Используйте Cython как конвертер Python в C
  • Cython: Как перемещать большие объекты, не копируя их?
  • Может ли класс cdef хранить переменную, которая не объявлена ​​(type-)?
  • Китон: для i от 1 <= i <N
  • Buildout с частью сборки с Cython
  • Компиляция Python в C с использованием Cython
  • Как правильно передать scipy.sparse CSR-матрицу в функцию cython?
  • Медленное деление на cython
  • Cython: ошибка сегментации с использованием API Вложение Cython в C
  • Python - лучший язык программирования в мире.