LINUX.ORG.RU

SWIG + Python Enums

 , ,


0

4

Добрый день. Есть библиотека на 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 слой.

Возможно, кто-то сталкивался уже с подобной проблемой и как-то ее решил. Буду рад выслушать любые предложения.


Возможно, кто-то сталкивался уже с подобной проблемой и как-то ее решил. Буду рад выслушать любые предложения.

как вариант — перейти на pybind11, там с enum'ами всё хорошо, насколько мне известно :)

Sahas ★★★★☆
()
Ответ на: комментарий от Sahas

SWIG был выбран по определенным причинам, поэтому придется работать с ним. И он вроде как действительно неплох. Некоторые сложности возникают из-за недостатка знаний, который пытаюсь восполнить.

gogoer
() автор топика