tzh
2024-08-22 c7d0944258c7d0943aa7b2211498fd612971ce27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
.. highlightlang:: c
 
.. _iterator:
 
Iterator Protocol
=================
 
.. versionadded:: 2.2
 
There are two functions specifically for working with iterators.
 
 
.. c:function:: int PyIter_Check(PyObject *o)
 
   Return true if the object *o* supports the iterator protocol.
 
   This function can return a false positive in the case of old-style
   classes because those classes always define a :c:member:`tp_iternext`
   slot with logic that either invokes a :meth:`next` method or raises
   a :exc:`TypeError`.
 
.. c:function:: PyObject* PyIter_Next(PyObject *o)
 
   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.
 
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 */
   }