diff --git a/src/wrap_cl.hpp b/src/wrap_cl.hpp
index 03173cd62a1ae68579858fef4ade86914e1a451e..c46191c8409434a4084f7b08ce4e240e4ea12cb3 100644
--- a/src/wrap_cl.hpp
+++ b/src/wrap_cl.hpp
@@ -149,7 +149,7 @@
     } \
     else \
     { \
-      PYTHON_FOREACH(py_dev, py_devices) \
+      for (py::handle py_dev: py_devices) \
         devices_vec.push_back( \
             (py_dev).cast<device &>().data()); \
       num_devices = devices_vec.size(); \
@@ -1034,7 +1034,7 @@ namespace pyopencl
 
     if (py_properties.ptr() != Py_None)
     {
-      PYTHON_FOREACH(prop_tuple_py, py_properties)
+      for (py::handle prop_tuple_py: py_properties)
       {
         py::tuple prop_tuple(prop_tuple_py.cast<py::tuple>());
 
@@ -1423,7 +1423,7 @@ namespace pyopencl
     cl_uint num_events_in_wait_list = 0;
     std::vector<cl_event> event_wait_list(len(events));
 
-    PYTHON_FOREACH(evt, events)
+    for (py::handle evt: events)
       event_wait_list[num_events_in_wait_list++] =
         evt.cast<event &>().data();
 
@@ -1482,7 +1482,7 @@ namespace pyopencl
     cl_uint num_events = 0;
     std::vector<cl_event> event_list(len(py_events));
 
-    PYTHON_FOREACH(py_evt, py_events)
+    for (py::handle py_evt: py_events)
       event_list[num_events++] = py_evt.cast<event &>().data();
 
     PYOPENCL_CALL_GUARDED(clEnqueueWaitForEvents, (
@@ -1646,7 +1646,7 @@ namespace pyopencl
     PYOPENCL_PARSE_WAIT_FOR;
 
     std::vector<cl_mem> mem_objects;
-    PYTHON_FOREACH(mo, py_mem_objects)
+    for (py::handle mo: py_mem_objects)
       mem_objects.push_back(mo.cast<const memory_object &>().data());
 
     cl_event evt;
@@ -1687,7 +1687,7 @@ namespace pyopencl
         clEnqueueMigrateMemObjectEXT, enqueue_migrate_fn);
 
     std::vector<cl_mem> mem_objects;
-    PYTHON_FOREACH(mo, py_mem_objects)
+    for (py::handle mo: py_mem_objects)
       mem_objects.push_back(mo.cast<memory_object &>().data());
 
     cl_event evt;
@@ -3289,7 +3289,7 @@ namespace pyopencl
 
         std::vector<std::string> header_names;
         std::vector<cl_program> programs;
-        PYTHON_FOREACH(name_hdr_tup_py, py_headers)
+        for (py::handle name_hdr_tup_py: py_headers)
         {
           py::tuple name_hdr_tup = py::reinterpret_borrow<py::tuple>(name_hdr_tup_py);
           if (py::len(name_hdr_tup) != 2)
@@ -3467,7 +3467,7 @@ namespace pyopencl
     PYOPENCL_PARSE_PY_DEVICES;
 
     std::vector<cl_program> programs;
-    PYTHON_FOREACH(py_prg, py_programs)
+    for (py::handle py_prg: py_programs)
     {
       program &prg = (py_prg).cast<program &>();
       programs.push_back(prg.data());
@@ -4015,7 +4015,7 @@ namespace pyopencl
     PYOPENCL_PARSE_WAIT_FOR; \
     \
     std::vector<cl_mem> mem_objects; \
-    PYTHON_FOREACH(mo, py_mem_objects) \
+    for (py::handle mo: py_mem_objects) \
       mem_objects.push_back((mo).cast<memory_object_holder &>().data()); \
     \
     cl_event evt; \
diff --git a/src/wrap_helpers.hpp b/src/wrap_helpers.hpp
index 1635a6846690f6b618bf7642c316c36aa63342f4..d9b2389dbb32f5121bca8af8da5c56292bb3efd7 100644
--- a/src/wrap_helpers.hpp
+++ b/src/wrap_helpers.hpp
@@ -39,9 +39,6 @@ namespace py = pybind11;
 #define DEF_SIMPLE_RW_MEMBER(NAME) \
   def_readwrite(#NAME, &cls::m_##NAME)
 
-#define PYTHON_FOREACH(NAME, ITERABLE) \
-  for (py::handle NAME: ITERABLE)
-
 #define COPY_PY_LIST(TYPE, NAME) \
   { \
     for (auto it: py_##NAME) \