Какова pythonic структура кода интерфейса python-c ++ со многими функциями? - PullRequest
0 голосов
/ 07 сентября 2011

Я пишу интерфейс Python для библиотеки C ++ и задаюсь вопросом о правильном дизайне библиотеки.

Я обнаружил (трудный путь), что все методы, передаваемые в python, должны быть объявлены как статические. Если я правильно понимаю, это означает, что все функции в основном должны быть определены в одном файле .cpp. В моем интерфейсе много функций, поэтому это очень быстро уродливо.

Каков стандартный способ решения этой проблемы? Возможности, которые я мог придумать:

  • не беспокойтесь об этом и используйте один looong .cpp файл
  • компилировать в несколько библиотек (.so файл)
  • записать .cpp для каждой группы функций и #include, что .cpp в тело основного определяющего файла cpp (файла с PyMethodDef)

они оба кажутся очень некрасивыми

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Я обнаружил (трудный путь), что все методы, переданные Python, должны быть объявленным статическим. Если я правильно понимаю, это означает, что все функции в основном должны быть определены в том же файле .cpp. мой Интерфейс имеет много функций, поэтому он очень быстро уродлив.

Где ты это узнал? Это не правда Ключевое слово static означает две разные вещи в C ++. Существует классическая статика, которая означает, что функция в области классов вызывается без экземпляра объекта (как обычная функция). Существует также статическая связь, которая означает, что ваши функции не добавляются в глобальную таблицу смещений, и вам будет сложно найти их за пределами единицы перевода (файл CPP).

Я бы рекомендовал посмотреть Boost.Python . Они решили многие проблемы, с которыми вы могли бы столкнуться, и сделали так, чтобы C ++ и Python общались друг с другом.

0 голосов
/ 07 сентября 2011

Почему вы говорите, что все функции, вызываемые Python, должны быть статическими?Это обычно так, чтобы избежать конфликтов имен (поскольку любое пространство имен и т. Д. Будет игнорироваться из-за extern "C"), но то, является ли функция статической или нет, не имеет значения.

При моем взаимодействии с библиотекой на C ++, по моему опыту, обычно нет большой проблемы сделать ее статичной и поместить все функции в один модуль перевода, потому что функции будут просто небольшими обертками, которыевызовите реальный C ++, и, как правило, он будет автоматически сгенерирован из некоторого файла описателя;Вы, конечно, не собираетесь писать все необходимые шаблоны вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...