make 'enumerate_reversed()' work with generators (#2795)
This commit is contained in:
@@ -161,13 +161,16 @@ def delete_items(obj, keys):
|
|||||||
|
|
||||||
def enumerate_reversed(iterable, start=0, length=None):
|
def enumerate_reversed(iterable, start=0, length=None):
|
||||||
"""Enumerate 'iterable' and return its elements in reverse order"""
|
"""Enumerate 'iterable' and return its elements in reverse order"""
|
||||||
start -= 1
|
|
||||||
if length is None:
|
if length is None:
|
||||||
length = len(iterable)
|
length = len(iterable)
|
||||||
return zip(
|
|
||||||
range(length - start, start, -1),
|
try:
|
||||||
reversed(iterable),
|
iterable = zip(range(start-1+length, start-1, -1), reversed(iterable))
|
||||||
)
|
except TypeError:
|
||||||
|
iterable = list(zip(range(start, start+length), iterable))
|
||||||
|
iterable.reverse()
|
||||||
|
|
||||||
|
return iterable
|
||||||
|
|
||||||
|
|
||||||
def number_to_string(value, numbers=(int, float)):
|
def number_to_string(value, numbers=(int, float)):
|
||||||
|
|||||||
@@ -541,6 +541,41 @@ class TestOther(unittest.TestCase):
|
|||||||
r = util.filter_dict(d)
|
r = util.filter_dict(d)
|
||||||
self.assertEqual(r, {"foo": 123})
|
self.assertEqual(r, {"foo": 123})
|
||||||
|
|
||||||
|
def test_enumerate_reversed(self):
|
||||||
|
|
||||||
|
seq = [11, 22, 33]
|
||||||
|
result = [(3, 33), (2, 22), (1, 11)]
|
||||||
|
|
||||||
|
def gen():
|
||||||
|
for i in seq:
|
||||||
|
yield i
|
||||||
|
|
||||||
|
def gen_2():
|
||||||
|
yield from seq
|
||||||
|
|
||||||
|
def assertEqual(it1, it2):
|
||||||
|
ae = self.assertEqual
|
||||||
|
for i1, i2 in zip(it1, it2, strict=True):
|
||||||
|
ae(i1, i2)
|
||||||
|
|
||||||
|
assertEqual(
|
||||||
|
util.enumerate_reversed(seq), [(2, 33), (1, 22), (0, 11)])
|
||||||
|
assertEqual(
|
||||||
|
util.enumerate_reversed(seq, 1), result)
|
||||||
|
assertEqual(
|
||||||
|
util.enumerate_reversed(seq, 2), [(4, 33), (3, 22), (2, 11)])
|
||||||
|
|
||||||
|
assertEqual(
|
||||||
|
util.enumerate_reversed(gen(), 0, len(seq)),
|
||||||
|
[(2, 33), (1, 22), (0, 11)])
|
||||||
|
assertEqual(
|
||||||
|
util.enumerate_reversed(gen(), 1, len(seq)), result)
|
||||||
|
assertEqual(
|
||||||
|
util.enumerate_reversed(gen_2(), 1, len(seq)), result)
|
||||||
|
assertEqual(
|
||||||
|
util.enumerate_reversed(gen_2(), 2, len(seq)),
|
||||||
|
[(4, 33), (3, 22), (2, 11)])
|
||||||
|
|
||||||
def test_number_to_string(self, f=util.number_to_string):
|
def test_number_to_string(self, f=util.number_to_string):
|
||||||
self.assertEqual(f(1) , "1")
|
self.assertEqual(f(1) , "1")
|
||||||
self.assertEqual(f(1.0) , "1.0")
|
self.assertEqual(f(1.0) , "1.0")
|
||||||
|
|||||||
Reference in New Issue
Block a user