From a3090ff580f6c11a5063bbbb4408d841544efc45 Mon Sep 17 00:00:00 2001 From: Samuel Jackson <samueljackson@outlook.com> Date: Wed, 23 Jan 2019 15:40:45 +0000 Subject: [PATCH] Fix column types returned by TableWorkspace in Python For more complex types such as V3D, the python API for TableWorkspace used to return a incomprehensible string. Now it returns a proper string type name. --- .../api/src/Exports/ITableWorkspace.cpp | 14 ++++++-------- .../python/mantid/api/ITableWorkspaceTest.py | 19 ++++++++++++++++--- docs/source/release/v3.14.0/framework.rst | 1 + 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp b/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp index 99108d3813d..b88671b0c27 100644 --- a/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp +++ b/Framework/PythonInterface/mantid/api/src/Exports/ITableWorkspace.cpp @@ -303,20 +303,18 @@ PyObject *row(ITableWorkspace &self, int row) { * @param self A reference to the TableWorkspace python object that we were * called on */ -PyObject *columnTypes(ITableWorkspace &self) { +boost::python::list columnTypes(ITableWorkspace &self) { int numCols = static_cast<int>(self.columnCount()); - PyObject *list = PyList_New(numCols); + boost::python::list types; for (int col = 0; col < numCols; col++) { - Mantid::API::Column_const_sptr column = self.getColumn(col); - const std::type_info &typeID = column->get_type_info(); - if (PyList_SetItem(list, col, FROM_CSTRING(typeID.name()))) { - throw std::runtime_error("Error while building list"); - } + const auto column = self.getColumn(col); + const auto &type = column->type(); + types.append(type); } - return list; + return types; } /** diff --git a/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py b/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py index ea1baf299d4..2d9fe0a81c3 100644 --- a/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py +++ b/Framework/PythonInterface/test/python/mantid/api/ITableWorkspaceTest.py @@ -211,12 +211,25 @@ class ITableWorkspaceTest(unittest.TestCase): table.addRow([3, 4]) self.assertEquals(table.rowCount(), 2) + def test_column_types(self): + table = WorkspaceFactory.createTable() + table.addColumn(type="int",name="index") + table.addColumn(type="str",name="value") + table.addColumn(type="V3D",name="position") + + types = table.columnTypes() + + self.assertEqual(types[0], "int") + self.assertEqual(types[1], "str") + self.assertEqual(types[2], "V3D") + + def test_convert_to_dict(self): from mantid.kernel import V3D expected_output = { - 'index': [1, 2], - 'value': ['10', '100'], - 'position': [V3D(0, 0, 1), V3D(1, 0, 0)] + 'index': [1, 2], + 'value': ['10', '100'], + 'position': [V3D(0, 0, 1), V3D(1, 0, 0)] } table = WorkspaceFactory.createTable() diff --git a/docs/source/release/v3.14.0/framework.rst b/docs/source/release/v3.14.0/framework.rst index 30bde215b78..b597b5e32f0 100644 --- a/docs/source/release/v3.14.0/framework.rst +++ b/docs/source/release/v3.14.0/framework.rst @@ -145,6 +145,7 @@ Improvements - :ref:`ChudleyElliot <func-ChudleyElliot>` includes hbar in the definition - :ref:`Functions <FitFunctionsInPython>` may now have their constraint penalties for fitting set in python using ``function.setConstraintPenaltyFactor("parameterName", double)``. - :py:obj:`mantid.kernel.Logger` now handles unicode in python2 +- :py:meth:`mantid.api.ITableWorkspace.columnTypes` now returns human readable strings for non-primitive column types. Bugfixes -- GitLab