second commit
This commit is contained in:
70
env/lib/python3.11/site-packages/future/builtins/newnext.py
vendored
Normal file
70
env/lib/python3.11/site-packages/future/builtins/newnext.py
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
'''
|
||||
This module provides a newnext() function in Python 2 that mimics the
|
||||
behaviour of ``next()`` in Python 3, falling back to Python 2's behaviour for
|
||||
compatibility if this fails.
|
||||
|
||||
``newnext(iterator)`` calls the iterator's ``__next__()`` method if it exists. If this
|
||||
doesn't exist, it falls back to calling a ``next()`` method.
|
||||
|
||||
For example:
|
||||
|
||||
>>> class Odds(object):
|
||||
... def __init__(self, start=1):
|
||||
... self.value = start - 2
|
||||
... def __next__(self): # note the Py3 interface
|
||||
... self.value += 2
|
||||
... return self.value
|
||||
... def __iter__(self):
|
||||
... return self
|
||||
...
|
||||
>>> iterator = Odds()
|
||||
>>> next(iterator)
|
||||
1
|
||||
>>> next(iterator)
|
||||
3
|
||||
|
||||
If you are defining your own custom iterator class as above, it is preferable
|
||||
to explicitly decorate the class with the @implements_iterator decorator from
|
||||
``future.utils`` as follows:
|
||||
|
||||
>>> @implements_iterator
|
||||
... class Odds(object):
|
||||
... # etc
|
||||
... pass
|
||||
|
||||
This next() function is primarily for consuming iterators defined in Python 3
|
||||
code elsewhere that we would like to run on Python 2 or 3.
|
||||
'''
|
||||
|
||||
_builtin_next = next
|
||||
|
||||
_SENTINEL = object()
|
||||
|
||||
def newnext(iterator, default=_SENTINEL):
|
||||
"""
|
||||
next(iterator[, default])
|
||||
|
||||
Return the next item from the iterator. If default is given and the iterator
|
||||
is exhausted, it is returned instead of raising StopIteration.
|
||||
"""
|
||||
|
||||
# args = []
|
||||
# if default is not _SENTINEL:
|
||||
# args.append(default)
|
||||
try:
|
||||
try:
|
||||
return iterator.__next__()
|
||||
except AttributeError:
|
||||
try:
|
||||
return iterator.next()
|
||||
except AttributeError:
|
||||
raise TypeError("'{0}' object is not an iterator".format(
|
||||
iterator.__class__.__name__))
|
||||
except StopIteration as e:
|
||||
if default is _SENTINEL:
|
||||
raise e
|
||||
else:
|
||||
return default
|
||||
|
||||
|
||||
__all__ = ['newnext']
|
Reference in New Issue
Block a user