aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-08-01 11:47:30 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-08-01 12:13:40 +0530
commite0f2b4b47de79b0b7a1bf957dd18ed5b79eb4d49 (patch)
treed568b88d594b8e54fce23b3c6ced51adb451f9ad
parenteca330cb883fd2c2df250509d55fbbee972ac964 (diff)
downloadhypervideo-pre-e0f2b4b47de79b0b7a1bf957dd18ed5b79eb4d49.tar.lz
hypervideo-pre-e0f2b4b47de79b0b7a1bf957dd18ed5b79eb4d49.tar.xz
hypervideo-pre-e0f2b4b47de79b0b7a1bf957dd18ed5b79eb4d49.zip
[utils] Fix slicing of reversed `LazyList`
Closes #589
-rw-r--r--test/test_utils.py4
-rw-r--r--yt_dlp/utils.py17
2 files changed, 12 insertions, 9 deletions
diff --git a/test/test_utils.py b/test/test_utils.py
index 4bfe250ac..f73e7b204 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -1537,8 +1537,11 @@ Line 1
self.assertEqual(LazyList(it).exhaust(), it)
self.assertEqual(LazyList(it)[5], it[5])
+ self.assertEqual(LazyList(it)[5:], it[5:])
+ self.assertEqual(LazyList(it)[:5], it[:5])
self.assertEqual(LazyList(it)[::2], it[::2])
self.assertEqual(LazyList(it)[1::2], it[1::2])
+ self.assertEqual(LazyList(it)[5::-1], it[5::-1])
self.assertEqual(LazyList(it)[6:2:-2], it[6:2:-2])
self.assertEqual(LazyList(it)[::-1], it[::-1])
@@ -1550,6 +1553,7 @@ Line 1
self.assertEqual(list(LazyList(it).reverse()), it[::-1])
self.assertEqual(list(LazyList(it).reverse()[1:3:7]), it[::-1][1:3:7])
+ self.assertEqual(list(LazyList(it).reverse()[::-1]), it)
def test_LazyList_laziness(self):
diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py
index 998689efe..4f584596d 100644
--- a/yt_dlp/utils.py
+++ b/yt_dlp/utils.py
@@ -3993,28 +3993,27 @@ class LazyList(collections.abc.Sequence):
@staticmethod
def __reverse_index(x):
- return -(x + 1)
+ return None if x is None else -(x + 1)
def __getitem__(self, idx):
if isinstance(idx, slice):
- step = idx.step or 1
- start = idx.start if idx.start is not None else 0 if step > 0 else -1
- stop = idx.stop if idx.stop is not None else -1 if step > 0 else 0
if self.__reversed:
- (start, stop), step = map(self.__reverse_index, (start, stop)), -step
- idx = slice(start, stop, step)
+ idx = slice(self.__reverse_index(idx.start), self.__reverse_index(idx.stop), -(idx.step or 1))
+ start, stop, step = idx.start, idx.stop, idx.step or 1
elif isinstance(idx, int):
if self.__reversed:
idx = self.__reverse_index(idx)
- start = stop = idx
+ start, stop, step = idx, idx, 0
else:
raise TypeError('indices must be integers or slices')
- if start < 0 or stop < 0:
+ if ((start or 0) < 0 or (stop or 0) < 0
+ or (start is None and step < 0)
+ or (stop is None and step > 0)):
# We need to consume the entire iterable to be able to slice from the end
# Obviously, never use this with infinite iterables
return self.__exhaust()[idx]
- n = max(start, stop) - len(self.__cache) + 1
+ n = max(start or 0, stop or 0) - len(self.__cache) + 1
if n > 0:
self.__cache.extend(itertools.islice(self.__iterable, n))
return self.__cache[idx]