From dd3a6a9fd10fd972bb9e77068c4ea1f9df015f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Mon, 1 Aug 2022 14:08:44 +0200 Subject: [PATCH] make 'enumerate_reversed()' work with generators (#2795) --- gallery_dl/util.py | 13 ++++++++----- test/test_util.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/gallery_dl/util.py b/gallery_dl/util.py index 009ee08d..4ba1cbae 100644 --- a/gallery_dl/util.py +++ b/gallery_dl/util.py @@ -161,13 +161,16 @@ def delete_items(obj, keys): def enumerate_reversed(iterable, start=0, length=None): """Enumerate 'iterable' and return its elements in reverse order""" - start -= 1 if length is None: length = len(iterable) - return zip( - range(length - start, start, -1), - reversed(iterable), - ) + + try: + 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)): diff --git a/test/test_util.py b/test/test_util.py index 7ab11756..96f813b0 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -541,6 +541,41 @@ class TestOther(unittest.TestCase): r = util.filter_dict(d) 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): self.assertEqual(f(1) , "1") self.assertEqual(f(1.0) , "1.0")