Переопределите функцию SWIG или измените объект результата C ++ - PullRequest
0 голосов
/ 17 января 2012

У меня есть функция, сгенерированная SWIG следующим образом:

SWIGINTERN PyObject *_wrap_StrVector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
  PySliceObject *arg2 = (PySliceObject *) 0 ;
  void *argp1 = 0 ;
  int res1 = 0 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;
  std::vector< std::string,std::allocator< std::string > > *result = 0 ;

  if (!PyArg_ParseTuple(args,(char *)"OO:StrVector___getitem__",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StrVector___getitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
  }
  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
  {
    if (!PySlice_Check(obj1)) {
      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StrVector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
    }
    arg2 = (PySliceObject *) obj1;
  }
  try {
    result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getitem____SWIG_0(arg1,arg2);
  }
  catch(std::out_of_range &_e) {
    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
  }

  *****1*****
  ***//I want to modify or print variable result here like printf("%s", result->c_str());***

  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
  return resultobj;
fail:
  return NULL;
}

Мне нужно напечатать результат переменной в позиции 1 (как указано в коде).Typemap (argout), похоже, здесь не очень поможет.

1 Ответ

2 голосов
/ 17 января 2012

Я предполагаю, что функция, которую вы хотите изменить, это std::vector<std::string> '__getitem__ подпрограмма в Python.

Самый простой и безопасный способ изменить или перехватить результат возвращаемого значенияна самом деле это делается на стороне Python, используя %feature("pythonappend"), например:

%module test

%{
#include "test.h"
%}

%include "pyabc.i"
%include "std_vector.i"
%include "std_string.i"

%feature("pythonappend") std::vector<std::string>::__getitem__ %{
  # do something
  print val
%}

%include "test.h"

%template (StringVector) std::vector<std::string>;

Причина, по которой это самый простой способ изменения результата, заключается в том, что следующий самый простой способ изменения результата требует изменениякарта типов для возвращаемого типа - в данном случае std::string.Чтобы сделать это, вы в конечном итоге измените существующую карту типов std::string, которая выглядит несколько беспорядочно.

В качестве альтернативы вы можете использовать директиву %exception, чтобы поместить некоторый код C ++ после$action, но если это не для проверки правильности возвращенного результата, он выглядит довольно хакерским.

...