Как stringfy объект матрицы swig в python

Я использую swig wrapper openbabel (написанный на C ++ и поставляющий оболочку python через swig)

Ниже я просто использую его, чтобы прочитать файл структуры молекулы и получить его свойство unitcell.

import pybel for molecule in pybel.readfile('pdb','./test.pdb'): unitcell = molecule.unitcell print unitcell |..> |..> <openbabel.OBUnitCell; proxy of <Swig Object of type 'OpenBabel::OBUnitCell *' at 0x17b390c0> > 

Единица измерения имеет функцию CellMatrix (),

 unitcell.GetCellMatrix() <22> <openbabel.matrix3x3; proxy of <Swig Object of type 'OpenBabel::matrix3x3 *' at 0x17b3ecf0> > 

OpenBabel :: matrix3x3 выглядит примерно так:

 1 2 3 4 5 6 7 8 9 

Мне интересно, как распечатать содержимое матрицы3 * 3. Я пробовал __str__ и __repr__ с ним.

Любой общий способ stringfy содержимого матрицы, завернутой качанием в python?

благодаря

2 Solutions collect form web for “Как stringfy объект матрицы swig в python”

Основываясь на этой документации openbabel, похоже, что есть хорошая причина, что привязки Python не имеют приятного способа печати matrix3x3 object . Класс matrix3x3 C ++ перегружает оператор << , который SWIG просто игнорирует:

http://openbabel.org/api/2.2.0/classOpenBabel_1_1matrix3x3.shtml

Это означает, что вам нужно будет изменить файл интерфейса SWIG (см. http://www.swig.org/Doc1.3/SWIGPlus.html#SWIGPlus_class_extension ), чтобы добавить метод __str__ в openbabel::matrix3x3 на C ++, который обертывает оператор << . Ваш метод может очень похож на

 std::string __str__() { //make sure you include sstream in the SWIG interface file std::ostringstream oss(std::ostringstream::out); oss << (*this); return oss.str(); } 

Я считаю, что SWIG будет правильно обрабатывать C ++ тип возвращаемого значения std::string в этом случае, но если нет, вам, возможно, придется поиграть с возвратом массива символов.

На этом этапе вы сможете перекомпилировать привязки и повторить свой код Python. Вызов str() объекта matrix3x3 должен теперь отображать то, что будет отображаться с помощью оператора << на C ++.

В дополнение к ответу от @jhoon, похоже, что SWIG не распознает тип возврата std :: string, поэтому измените функцию, чтобы возвращать const char * . Кроме того, поскольку это функция вне класса, вы не можете использовать self, но вы должны использовать переменную $ self SWIG.

Итак, в файле SWIG .i , если вы поместите следующее:

 %extend OpenBabel::matrix3x3 { const char* __str__() { std::ostringstream out; out << *$self; return out.str().c_str(); } }; 

вы должны получить желаемый результат при вызове печати Python на матрице3×3 .

Если вы обнаружите, что добавляете это ко многим классам, рассмотрите возможность его переноса в макрос:

 %define __STR__() const char* __str__() { std::ostringstream out; out << *$self; return out.str().c_str(); } %enddef 

а затем добавив его в класс:

 %extend OpenBabel::matrix3x3 { __STR__() }; 
Python - лучший язык программирования в мире.