symbian-qemu-0.9.1-12/python-2.6.1/Doc/c-api/iter.rst
author Gareth Stockwell <gareth.stockwell@accenture.com>
Wed, 22 Sep 2010 15:40:40 +0100
branchgraphics-phase-3
changeset 111 345f1c88c950
parent 1 2fb8b9db1c86
permissions -rw-r--r--
Fixes to syborg-graphicswrapper.vcproj These changes allow syborg-graphicswrapper to link against the hostthreadadapter and khronosapiwrapper libraries built by the graphics.simulator component. The .vcproj file uses relative paths, which requires that the following three packages are laid out as follows: os/ graphics adapt/ graphics.simulator qemu

.. highlightlang:: c

.. _iterator:

Iterator Protocol
=================

.. versionadded:: 2.2

There are only a couple of functions specifically for working with iterators.


.. cfunction:: int PyIter_Check(PyObject *o)

   Return true if the object *o* supports the iterator protocol.


.. cfunction:: PyObject* PyIter_Next(PyObject *o)

   Return the next value from the iteration *o*.  If the object is an iterator,
   this retrieves the next value from the iteration, and returns *NULL* with no
   exception set if there are no remaining items.  If the object is not an
   iterator, :exc:`TypeError` is raised, or if there is an error in retrieving the
   item, returns *NULL* and passes along the exception.

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 */
   }