py::object deepCopy()

in src/accumulator.cc [643:686]


  py::object deepCopy(const py::handle& v) {
    if (v.ptr() == Py_True) {
      return py::reinterpret_borrow<py::object>(v);
    } else if (v.ptr() == Py_False) {
      return py::reinterpret_borrow<py::object>(v);
    } else if (v.ptr() == Py_None) {
      return py::reinterpret_borrow<py::object>(v);
    } else if (py::isinstance<py::float_>(v)) {
      return py::reinterpret_borrow<py::object>(v);
    } else if (py::isinstance<py::dict>(v)) {
      const py::dict& olddict = py::reinterpret_borrow<py::dict>(v);
      py::dict newdict;
      for (auto& [key, value] : olddict) {
        newdict[deepCopy(key)] = deepCopy(value);
      }
      return py::reinterpret_steal<py::object>(newdict.release());
    } else if (py::isinstance<py::str>(v)) {
      return py::reinterpret_borrow<py::object>(v);
    } else if (py::isinstance<py::array>(v)) {
      return py::reinterpret_borrow<py::object>(v);
    } else if (py::isinstance<py::int_>(v)) {
      return py::reinterpret_borrow<py::object>(v);
    } else if (py::isinstance<py::list>(v)) {
      const py::list& oldlist = py::reinterpret_borrow<py::list>(v);
      size_t n = oldlist.size();
      py::list newlist(n);
      for (size_t i = 0; i != n; ++i) {
        newlist[i] = deepCopy(oldlist[i]);
      }
      return py::reinterpret_steal<py::list>(newlist.release());
    } else if (auto t = rpc::tryFromPython(v)) {
      return rpc::toPython(t->to(rpc::kCPU, false, true));
    } else if (py::isinstance<py::tuple>(v)) {
      const py::tuple& oldtuple = py::reinterpret_borrow<py::tuple>(v);
      size_t n = oldtuple.size();
      py::tuple newtuple(n);
      for (size_t i = 0; i != n; ++i) {
        newtuple[i] = deepCopy(oldtuple[i]);
      }
      return py::reinterpret_steal<py::tuple>(newtuple.release());
    } else {
      return py::reinterpret_borrow<py::object>(v);
    }
  }