LINUX.ORG.RU

Автоматический импорт комментариев при биндинге C++ кода в python через SWIG

 , ,


0

3

Есть некий код на C++

struct A{
    ...
    double x;  //@ это координата
    double v;  //@ а это скорость 
    ...
};
Комментарии в плюсах нужны, что бы самому не запутаться (таких параметров как x десятки). Код импортируется в python через swig, и дальше
from mymodule import *
a = A()
a.x = 1 #@ это координата заданная в питон
...
Не все параметры из плюсов явно задаются в python.

Комментарии в питоне нужны что бы опять таки самому не запутаться + при запуске питоньего скрипта с параметром -h можно поглядеть какие в нем вообще есть параметры задаваемые для плюсов. Сейчас это сделано тупо, выводятся строки содержащие '#@'.

Хотелки: 1) приходится дублировать комментарии в питоне, которые уже однажды были написаны в плюсах, хочется от этого избавится но совершенно непонятно как. Видимо никак, поскольку питоний скрипт пишется руками, хотя можно сделать утилитку которая делает для него заготовку выдернув из плюсов строки с '//@'.

2) более важно - эти комментарии хочется собирать и сохранять отдельно в виде таблички 'имя параметра': 'описание (комментарий)'. Комментарии из питона выдергиваются довольно просто, за счет перегрузки A.__setattr__. Как выдергивать комментарии из плюсов совершенно непонятно, в документации swig я ничего по этому поводу не нашел. Пока что в голову приходит завести в плюсах отдельную строковую переменную с описанием всех параметров, но это еще одно дублирование.

Ну или макрос сделать

#define PARAM(T, K, H) T K; const char * K##_autodoc = #H;

struct A{
    ...
    PARAM(double, x, это координата);
    PARAM(double, v, а это скорость); 
    ...
};
но че то выглядит мерзко...

У кого какие идеи будут?;-)

★★★★

Ответ на: комментарий от eternal_sorrow

Это чересчур как то. Хотя возможно, потом анализировать его выхлоп...

AntonI ★★★★
() автор топика
Ответ на: комментарий от anonymous

кстати да. как насчёт писать самодокументированный код?

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

Для школьных задачек пойдет, для чего то актуального нет.

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

В редакторах может быть обеспечена возможность рефакторинга ... /хотя того, чего хочет ТС не встречал/.

anonymous
()
Ответ на: комментарий от anonymous

Рефакторинг тут вообще никаким боком. И речь идет об автоматизации процесса, 100 раз открывать редактор мягко говоря неудобно.

AntonI ★★★★
() автор топика

В итоге вытанцевалось такое решение:

struct A{
    ...
    double x; COMM("это координата");
    double v; COMM("а это скорость"); 
    ...
};
COMM это макрос, создающий поле вида
static const char * autodoc_номерстроки = "комментарий";

Дальше дело техники, в питоне можно найти все такие поля в классе, выдернуть из хидера соотв. строки, распарсить и достать имена полей.

Для автоматического формирования фрагмента в питоньем скрипте можно ввести цель в make, которая его будет просто выводить в stdout, дальше copy-paste

Надо бы только это как то dozygen-ом сопрячь еще.

AntonI ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.