Cómo encadenar un objeto de matriz de swig en python

Estoy usando swig wrapper de openbabel (escrito en C ++, y proporciono un wrapth de python a través de swig)

A continuación, solo lo uso para leer un archivo de estructura de molécula y obtener la propiedad unitcell de él.

import pybel for molecule in pybel.readfile('pdb','./test.pdb'): unitcell = molecule.unitcell print unitcell |..> |..> <openbabel.OBUnitCell; proxy of  > 

La célula unitaria tiene la función CellMatrix (),

 unitcell.GetCellMatrix()  <openbabel.matrix3x3; proxy of  > 

OpenBabel :: matrix3x3 es algo como:

 1 2 3 4 5 6 7 8 9 

Me pregunto cómo imprimir los contenidos de la matriz3 * 3. He intentado __str__ y __repr__ con él.

    ¿Alguna forma general de ajustar el contenido de una matriz envuelta por swing en python?

    Gracias

    Basado en esta documentación de openbabel, parece que hay una buena razón por la que los enlaces de Python no vienen con una buena forma de imprimir un matrix3x3 object . La clase matrix3x3 C ++ sobrecarga al operador << , que SWIG simplemente ignorará:

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

    Esto significa que necesitará modificar su archivo de interfaz SWIG (consulte http://www.swig.org/Doc1.3/SWIGPlus.html#SWIGPlus_class_extension ) para agregar un método __str__ a openbabel::matrix3x3 en C ++ que se ajusta el operador << Tu método podría parecerse mucho a

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

    Creo que SWIG manejará adecuadamente C ++, un tipo de retorno de std::string en este caso, pero si no, es posible que tenga que jugar con devolver una matriz de caracteres.

    En este punto, deberías poder volver a comstackr los enlaces y volver a ejecutar tu código Python. Llamar a str() en un objeto matrix3x3 ahora debería mostrar lo que se mostraría con el operador << en C ++.

    Más allá de la respuesta de @jhoon, parece que SWIG no reconoce el tipo de retorno std :: string, así que cambie la función para devolver el carácter const * . Además, como se trata de una función fuera de la clase, no puede utilizar self pero debe usar la variable $ self de SWIG.

    Entonces, en el archivo SWIG .i , si coloca lo siguiente:

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

    debe obtener el resultado deseado al llamar a la impresión de Python en un matrix3x3 .

    Si te encuentras agregando esto a muchas clases, considera envolverlo en una macro como:

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

    y luego agregarlo a la clase con:

     %extend OpenBabel::matrix3x3 { __STR__() };