diff --git a/src/python/nucleus/export_nuclei.cpp b/src/python/nucleus/export_nuclei.cpp index 85517b5a6..7fec3b2f7 100644 --- a/src/python/nucleus/export_nuclei.cpp +++ b/src/python/nucleus/export_nuclei.cpp @@ -60,17 +60,23 @@ void export_nuclei(python_module_reference m) { }; //} + pybind11::keep_alive<0, 1> ka; + python_class_type(m, "Nuclei") .def(pybind11::init<>()) .def(pybind11::init(list_ctor)) - .def_property("charges", get_charges_fxn, set_charges_fxn) + .def_property( + "charges", + pybind11::cpp_function( + get_charges_fxn, pybind11::return_value_policy::take_ownership, ka), + pybind11::cpp_function(set_charges_fxn)) .def("empty", [](nuclei_reference self) { return self.empty(); }) .def("push_back", push_back) .def("at", [](nuclei_reference self, size_type i) { return self[i]; }) .def("size", [](nuclei_reference self) { return self.size(); }) .def("__repr__", str_fxn) .def("__str__", str_fxn) - .def("__iter__", iter_fxn, pybind11::keep_alive<0, 1>()) + .def("__iter__", iter_fxn, ka) .def(pybind11::self == pybind11::self) .def(pybind11::self != pybind11::self); } diff --git a/src/python/point_charge/export_charges_view.cpp b/src/python/point_charge/export_charges_view.cpp index e05f547ce..e855d02c1 100644 --- a/src/python/point_charge/export_charges_view.cpp +++ b/src/python/point_charge/export_charges_view.cpp @@ -30,20 +30,27 @@ void export_charges_view_(const char* name, python_module_reference m) { using size_type = typename view_type::size_type; using point_set_reference = typename view_type::point_set_reference; + auto get_point_set_fxn = [](reference self) { return self.point_set(); }; + auto set_point_set_fxn = [](reference self, point_set_reference points) { + self.point_set() = points; + }; + auto str_fxn = [](const view_type& charges) { std::ostringstream stream; stream << charges; return stream.str(); }; + pybind11::keep_alive<0, 1> ka; + python_class_type(m, name) .def(pybind11::init<>()) .def(pybind11::init()) .def_property( - "point_set", [](reference self) { return self.point_set(); }, - [](reference self, point_set_reference points) { - self.point_set() = points; - }) + "point_set", + pybind11::cpp_function( + get_point_set_fxn, pybind11::return_value_policy::take_ownership, ka), + pybind11::cpp_function(set_point_set_fxn)) .def("empty", [](reference self) { return self.empty(); }) .def("at", [](reference self, size_type i) { return self[i]; }) .def("size", [](reference self) { return self.size(); })