| 
									
										
										
										
											2019-05-17 11:55:34 +02:00
										 |  |  | .. highlight:: c
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _iterator:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Iterator Protocol
 | 
					
						
							|  |  |  | =================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 22:42:46 -07:00
										 |  |  | There are two functions specifically for working with iterators.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:function:: int PyIter_Check(PyObject *o)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 16:40:34 -08:00
										 |  |  |    Return non-zero if the object *o* can be safely passed to
 | 
					
						
							|  |  |  |    :c:func:`PyIter_Next`, and ``0`` otherwise.  This function always succeeds.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-07 03:52:30 -07:00
										 |  |  | .. c:function:: int PyAIter_Check(PyObject *o)
 | 
					
						
							| 
									
										
										
										
											2021-03-23 23:57:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-02 12:31:05 -07:00
										 |  |  |    Return non-zero if the object *o* provides the :class:`AsyncIterator`
 | 
					
						
							|  |  |  |    protocol, and ``0`` otherwise.  This function always succeeds.
 | 
					
						
							| 
									
										
										
										
											2021-03-23 23:57:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:function:: PyObject* PyIter_Next(PyObject *o)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 16:40:34 -08:00
										 |  |  |    Return the next value from the iterator *o*.  The object must be an iterator
 | 
					
						
							|  |  |  |    according to :c:func:`PyIter_Check` (it is up to the caller to check this).
 | 
					
						
							|  |  |  |    If there are no remaining values, returns ``NULL`` with no exception set.
 | 
					
						
							|  |  |  |    If an error occurs while retrieving the item, returns ``NULL`` and passes
 | 
					
						
							|  |  |  |    along the exception.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | To write a loop which iterates over an iterator, the C code should look
 | 
					
						
							|  |  |  | something like this::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    PyObject *iterator = PyObject_GetIter(obj);
 | 
					
						
							|  |  |  |    PyObject *item;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    if (iterator == NULL) {
 | 
					
						
							|  |  |  |        /* propagate error */
 | 
					
						
							|  |  |  |    }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 23:25:56 -05:00
										 |  |  |    while ((item = PyIter_Next(iterator))) {
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |        /* do something with item */
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  |        /* release reference when done */
 | 
					
						
							|  |  |  |        Py_DECREF(item);
 | 
					
						
							|  |  |  |    }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Py_DECREF(iterator);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    if (PyErr_Occurred()) {
 | 
					
						
							|  |  |  |        /* propagate error */
 | 
					
						
							|  |  |  |    }
 | 
					
						
							|  |  |  |    else {
 | 
					
						
							|  |  |  |        /* continue doing useful work */
 | 
					
						
							|  |  |  |    }
 | 
					
						
							| 
									
										
										
										
											2020-10-09 17:15:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:type:: PySendResult
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The enum value used to represent different results of :c:func:`PyIter_Send`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-13 10:26:51 -07:00
										 |  |  |    .. versionadded:: 3.10
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 17:15:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Sends the *arg* value into the iterator *iter*. Returns:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    - ``PYGEN_RETURN`` if iterator returns. Return value is returned via *presult*.
 | 
					
						
							|  |  |  |    - ``PYGEN_NEXT`` if iterator yields. Yielded value is returned via *presult*.
 | 
					
						
							|  |  |  |    - ``PYGEN_ERROR`` if iterator has raised and exception. *presult* is set to ``NULL``.
 | 
					
						
							| 
									
										
										
										
											2020-10-13 10:26:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.10
 |