From e0db5b62be05aa66709c45bbd8418f42d84d8af5 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 25 Jun 2019 18:15:10 +0200 Subject: [PATCH] workaround in PyCXX classes due to removed support of old-style classes --- src/Base/GeometryPyCXX.cpp | 11 ++++++++++- src/CXX/Python3/ExtensionOldType.hxx | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Base/GeometryPyCXX.cpp b/src/Base/GeometryPyCXX.cpp index 6cbf2ab5b7..3edbc2453c 100644 --- a/src/Base/GeometryPyCXX.cpp +++ b/src/Base/GeometryPyCXX.cpp @@ -131,14 +131,23 @@ Py::Object Vector2dPy::repr() Py::Object Vector2dPy::getattro(const Py::String &name_) { + // For Py3 either handle __dict__ or implement __dir__ as shown here: + // https://stackoverflow.com/questions/48609111/how-is-dir-implemented-exactly-and-how-should-i-know-it + // std::string name( name_.as_std_string( "utf-8" ) ); - if (name == "__members__") { + if (name == "__members__") { // Py2 Py::List attr; attr.append(Py::String("x")); attr.append(Py::String("y")); return attr; } + else if (name == "__dict__") { // Py3 + Py::Dict attr; + attr.setItem(Py::String("x"), Py::Float(v.x)); + attr.setItem(Py::String("y"), Py::Float(v.y)); + return attr; + } else if (name == "x") { return Py::Float(v.x); } diff --git a/src/CXX/Python3/ExtensionOldType.hxx b/src/CXX/Python3/ExtensionOldType.hxx index 355dcfb220..5c65e8400e 100644 --- a/src/CXX/Python3/ExtensionOldType.hxx +++ b/src/CXX/Python3/ExtensionOldType.hxx @@ -157,6 +157,18 @@ namespace Py EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.find( name ); if( i == mm.end() ) { + if( name == "__dict__" ) // __methods__ is not supported in Py3 any more, use __dict__ instead + { + Dict methods; + + i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + + for( ; i != i_end; ++i ) + methods.setItem( String( (*i).first ), String( "" ) ); + + return methods; + } if( name == "__methods__" ) { List methods;