Я работал над этим с моим коллегой, и нам удалось найти некоторые решения.
Прежде всего, в SWI-файле .i важно определить эту переменную препроцессора:
%{
# define SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS
%}
И затем, чтобы убедиться, что ссылки, возвращаемые такими методами, как front (), back (), operator [] и т. Д., Действительно сопоставлены с правильным типом прокси для внутреннего вектора, помогают следующие сопоставления типов:
// In pop()
%typemap(out) std::vector<std::vector<ns::uint64_t> >::value_type {
$result = SWIG_NewPointerObj(SWIG_as_voidptr(&$1), $descriptor(std::vector<ns::uint64_t>), 0 | 0 );
}
// In front(), back(), __getitem__()
%typemap(out) std::vector<std::vector<ns::uint64_t> >::value_type & {
$result = SWIG_NewPointerObj(SWIG_as_voidptr($1), $descriptor(std::vector<ns::uint64_t>), 0 | 0 );
}
Мы также обнаружили, что если вы хотите, чтобы ns :: uint64_t обрабатывался как переменная long Python (эквивалентно long long без знака C), то потребовалось бы еще несколько типов, чтобы гарантировать, что методы вектора, использующие значения и ссылки, вместо этого будут просто используйте 64-битные целочисленные значения.
// In __getitem__()
%typemap(out) ns::uint64_t {
$result = PyLong_FromUnsignedLongLong($1);
}
// Not used (but probably useful to have, just in case)
%typemap(in) ns::uint64_t {
$1 = PyLong_AsUnsignedLongLong($input);
}
// In pop()
%typemap(out) std::vector<ns::uint64_t>::value_type {
$result = PyLong_FromUnsignedLongLong($1);
}
// In __getitem__(), front(), back()
%typemap(out) std::vector<ns::uint64_t>::value_type & {
$result = PyLong_FromUnsignedLongLong(*$1);
}
// In __setitem__(), append(), new Uint64Vector, push_back(), assign(), resize(), insert()
// This allows a python long literal number to be used as a parameter to the above methods.
// Note the use of a local variable declared at the SWIG wrapper function scope,
// by placing the variable declaration in parentheses () prior to the open brace {
%typemap(in) std::vector<ns::uint64_t>::value_type & (std::vector<ns::uint64_t>::value_type temp) {
temp = PyLong_AsUnsignedLongLong($input);
$1 = &temp;
}
Я надеюсь, что это решение поможет людям в будущем!