Добрый день. Есть библиотека на C++, нужно сделать для нее обертку для работы с Python. В качестве инструмента был выбран SWIG. Все более-менее работает, но остается нерешенным вопрос с использованием enum. В коде C++ присутствует множество enum, например,
enum class Color{Red, Green, Blue}
После парсинга мы создаем модуль my_module, а enum преобразуется в набор констант
color_red = 0, color_green = 1 и color_blue = 2
это, собственно, и не устраивает. Хочется использовать нормальный enum из Python.
в качестве временного решения пока используем преобразование констант в enum в рантайме, решение было подсмотрено в интернетах.
%pythoncode %{
from enum import Enum
def enum(prefix):
tmpD = {k:v for k,v in globals().items() if k.startswith(prefix + '_')}
for k,v in tmpD.items():
del globals()[k]
tmpD = {k[len(prefix)+1:]:v for k,v in tmpD.items()}
globals()[prefix] = Enum(prefix,tmpD)
enum('Color')
del enum
del Enum
%}
Оно работает, но мы лишаемся поддержки автодополнения при написании кода, да и в целом, это костыль.
Я так понимаю, единственно нормальный рабочий вариант - это в тайпмапе out создавать класс enum с помощью c api и возвращать этот объект в python слой.
Возможно, кто-то сталкивался уже с подобной проблемой и как-то ее решил. Буду рад выслушать любые предложения.