Как заставить swig генерировать соответствующий список аргументов на странице справки модуля? - PullRequest
1 голос
/ 15 марта 2019

Страница help модуля, созданного с помощью SWIG, не совсем полезна.На самом деле, он даже не перечисляет аргументы каждой функции.

Help on module example:

NAME
    example

FILE
    /home/anon/example.py

DESCRIPTION
    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 3.0.12
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.

FUNCTIONS
    fact(...)

    get_time(...)

    my_mod(...)

DATA
    cvar = <Swig global variables>

(END)

Вопрос: есть ли способ сообщить swig - с некоторой опцией - to по крайней мере включить точный список именованных аргументов каждой функции?

Я хотел бы получить по крайней мере что-то следующее:

...
fact(n)
...
my_mod(x, y)
...

Более высокий уровень качествадокументация в целом также приветствуется.

Я знаю, что могу получить этот результат, если переименую исходную функцию foo в _foo, а затем вручную определю новую foo().Но есть ли какой-то другой, систематический и встроенный подход, который достигает той же цели?


Это список команд, которые я выполнил, взятые из этого урока :

 ~$ swig -python example.i
 ~$ gcc -fPIC -c example.c example_wrap.c \
        -I/usr/include/python2.7
 ~$ ld -shared example.o example_wrap.o -o _example.so 

Файл example.c:

 /* File : example.c */

 #include <time.h>
 double My_variable = 3.0;

 int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }

 int my_mod(int x, int y) {
     return (x%y);
 }

 char *get_time()
 {
     time_t ltime;
     time(&ltime);
     return ctime(&ltime);
 }

Файл example.i:

 /* example.i */
 %module example
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
 %}

 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Другой альтернативой является использование doxy2swig.py, см., Например, http://github.com/m7thon/doxy2swig

Заголовок с использованием doxygen example.h

#pragma once

extern double My_variable; ///< My variable for something

/**
 * Factorial function
 *
 * @param n
 *
 * @return n!
 */
extern int fact(int n);

/**
 * Module function
 *
 * @param x
 * @param y
 *
 * @return
 */
extern int my_mod(int x, int y);

/**
 * Get the current time
 *
 *
 * @return string representation of time
 */
extern char *get_time();

Файл интерфейса example.i

 %module example
 %{
 /* Put header files here or function declarations like below */
 #include "example.h"
 %}

 %include "documentation.i"

 %include "example.h"

Для SWIG и компиляции выполните следующее.Это, конечно, можно настроить с помощью automake или CMake, если вы предпочитаете.

doxygen -g
sed -i 's/GENERATE_XML           = NO/GENERATE_XML = YES/g' Doxyfile
python doxy2swig.py -c -a ./xml/index.xml documentation.i
swig -python example.i
gcc -fPIC -c example.c example_wrap.c -I/usr/include/python2.7
ld -shared example.o example_wrap.o -o _example.so

В Python документация выглядит как

In [1]: import example
In [2]: help(example.get_time)

Help on function get_time in module example:

get_time()
    Get the current time

    Returns
    -------
    string representation of time

        get_time() -> char *

Она обобщает документацию для классов и довольногибкий.

1 голос
/ 15 марта 2019

См. 36.10 Функции документации в документации SWIG.

В частности, функция autodoc хорошо работает с вашим примером.Просто используйте:

swig -python -features autodoc example.i

Пример вывода:

>>> import example
>>> help(example)
Help on module example:

NAME
    example

DESCRIPTION
    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 3.0.12
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.

FUNCTIONS
    fact(n)
        fact(int n) -> int

    get_time()
        get_time() -> char *

    my_mod(x, y)
        my_mod(int x, int y) -> int

DATA
    cvar = <Swig global variables>

FILE
    c:\example\example.py
...