Skip to content

Commit 4ae7a3f

Browse files
committed
Fix Python container and pickle API
1 parent 8c57285 commit 4ae7a3f

File tree

4 files changed

+11
-6
lines changed

4 files changed

+11
-6
lines changed

include/openPMD/binding/python/Container.H

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
#include <cstddef>
3636
#include <memory>
37+
#include <pybind11/attr.h>
3738
#include <sstream>
3839
#include <string>
3940
#include <utility>
@@ -118,11 +119,12 @@ Class_ finalize_container(Class_ cl)
118119
// keep same policy as Container class: missing keys are created
119120
cl.def(
120121
"__getitem__",
121-
[](Map &m, KeyType const &k) -> MappedType & { return m[k]; },
122+
[](Map &m, KeyType const &k) -> MappedType { return m[k]; },
122123
// copy + keepalive
123124
// All objects in the openPMD object model are handles, so using a copy
124125
// is safer and still performant.
125-
py::return_value_policy::copy);
126+
py::return_value_policy::move,
127+
py::keep_alive<0, 1>());
126128

127129
// Assignment provided only if the type is copyable
128130
py::detail::map_assignment<Map, Class_>(cl);

include/openPMD/binding/python/Pickle.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ add_pickle(pybind11::class_<T_Args...> &cl, T_SeriesAccessor &&seriesAccessor)
5858
},
5959

6060
// __setstate__
61-
[&seriesAccessor](py::tuple t) {
61+
[&seriesAccessor](py::tuple const &t) {
6262
// our tuple has exactly two elements: filePath & group
6363
if (t.size() != 2)
6464
throw std::runtime_error("Invalid state!");

src/binding/python/MeshRecordComponent.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ void init_MeshRecordComponent(py::module &m)
8484
add_pickle(
8585
cl, [](openPMD::Series &series, std::vector<std::string> const &group) {
8686
uint64_t const n_it = std::stoull(group.at(1));
87-
return series.iterations[n_it].meshes[group.at(3)][group.at(4)];
87+
return series.iterations[n_it]
88+
.meshes[group.at(3)]
89+
[group.size() < 5 ? MeshRecordComponent::SCALAR
90+
: group.at(4)];
8891
});
8992

9093
finalize_container<PyMeshRecordComponentContainer>(py_mrc_cnt);

src/binding/python/RecordComponent.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,8 +1124,8 @@ void init_RecordComponent(py::module &m)
11241124
add_pickle(
11251125
cl, [](openPMD::Series &series, std::vector<std::string> const &group) {
11261126
uint64_t const n_it = std::stoull(group.at(1));
1127-
return series.iterations[n_it]
1128-
.particles[group.at(3)][group.at(4)][group.at(5)];
1127+
return series.iterations[n_it].particles[group.at(3)][group.at(
1128+
4)][group.size() < 6 ? RecordComponent::SCALAR : group.at(5)];
11291129
});
11301130

11311131
addRecordComponentSetGet(cl);

0 commit comments

Comments
 (0)