Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/future/builtins/newnext.py @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:18:57 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:d30785e31577 |
---|---|
1 ''' | |
2 This module provides a newnext() function in Python 2 that mimics the | |
3 behaviour of ``next()`` in Python 3, falling back to Python 2's behaviour for | |
4 compatibility if this fails. | |
5 | |
6 ``newnext(iterator)`` calls the iterator's ``__next__()`` method if it exists. If this | |
7 doesn't exist, it falls back to calling a ``next()`` method. | |
8 | |
9 For example: | |
10 | |
11 >>> class Odds(object): | |
12 ... def __init__(self, start=1): | |
13 ... self.value = start - 2 | |
14 ... def __next__(self): # note the Py3 interface | |
15 ... self.value += 2 | |
16 ... return self.value | |
17 ... def __iter__(self): | |
18 ... return self | |
19 ... | |
20 >>> iterator = Odds() | |
21 >>> next(iterator) | |
22 1 | |
23 >>> next(iterator) | |
24 3 | |
25 | |
26 If you are defining your own custom iterator class as above, it is preferable | |
27 to explicitly decorate the class with the @implements_iterator decorator from | |
28 ``future.utils`` as follows: | |
29 | |
30 >>> @implements_iterator | |
31 ... class Odds(object): | |
32 ... # etc | |
33 ... pass | |
34 | |
35 This next() function is primarily for consuming iterators defined in Python 3 | |
36 code elsewhere that we would like to run on Python 2 or 3. | |
37 ''' | |
38 | |
39 _builtin_next = next | |
40 | |
41 _SENTINEL = object() | |
42 | |
43 def newnext(iterator, default=_SENTINEL): | |
44 """ | |
45 next(iterator[, default]) | |
46 | |
47 Return the next item from the iterator. If default is given and the iterator | |
48 is exhausted, it is returned instead of raising StopIteration. | |
49 """ | |
50 | |
51 # args = [] | |
52 # if default is not _SENTINEL: | |
53 # args.append(default) | |
54 try: | |
55 try: | |
56 return iterator.__next__() | |
57 except AttributeError: | |
58 try: | |
59 return iterator.next() | |
60 except AttributeError: | |
61 raise TypeError("'{0}' object is not an iterator".format( | |
62 iterator.__class__.__name__)) | |
63 except StopIteration as e: | |
64 if default is _SENTINEL: | |
65 raise e | |
66 else: | |
67 return default | |
68 | |
69 | |
70 __all__ = ['newnext'] |