| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | .. highlightlang:: c
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _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
										 |  |  | 
 | 
					
						
							|  |  |  |    Return true if the object *o* supports the iterator protocol.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:function:: PyObject* PyIter_Next(PyObject *o)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 22:42:46 -07:00
										 |  |  |    Return the next value from the iteration *o*.  The object must be an iterator
 | 
					
						
							|  |  |  |    (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 */
 | 
					
						
							|  |  |  |    }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    while (item = PyIter_Next(iterator)) {
 | 
					
						
							|  |  |  |        /* do something with item */
 | 
					
						
							|  |  |  |        ...
 | 
					
						
							|  |  |  |        /* release reference when done */
 | 
					
						
							|  |  |  |        Py_DECREF(item);
 | 
					
						
							|  |  |  |    }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Py_DECREF(iterator);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    if (PyErr_Occurred()) {
 | 
					
						
							|  |  |  |        /* propagate error */
 | 
					
						
							|  |  |  |    }
 | 
					
						
							|  |  |  |    else {
 | 
					
						
							|  |  |  |        /* continue doing useful work */
 | 
					
						
							|  |  |  |    }
 |