Как сохранить имя класса 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() 
  • Читайте в большом файле и создайте словарь
  • Передача указателя C ++ в качестве аргумента в функцию Cython
  • Обтекание std :: array в Cython и отображение его в представлениях памяти
  • Используйте Cython как конвертер Python в C
  • Убейте функцию подвески в Python в многопоточном окружении
  • Cython C ++ и std :: string
  • Самый быстрый способ сравнить строку и предыдущую строку в кадре данных pandas с миллионами строк
  • Как вернуть новые объекты C ++ в Cython?
  • Использование самоопределенного кода Cython из другого кода Cython
  • Связывание массива C с массивом Numpy без копирования
  • Как скомпилировать код .c из Cython с gcc
  • Python - лучший язык программирования в мире.