Skip to content

Commit e1f6ff0

Browse files
committed
added negative index and slice support
1 parent 4302652 commit e1f6ff0

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

aaf/iterator.pyx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,32 @@ cdef class BaseIterator(object):
1111
def __cinit__(self):
1212
self._clone_iter = None
1313

14-
def __getitem__(self, int index):
14+
def __getitem__(self, index):
15+
16+
if isinstance(index, slice):
17+
return self._getslice(index)
18+
19+
index = int(index)
20+
21+
if index < 0:
22+
index = len(self) + index
23+
24+
if index < 0:
25+
raise IndexError("index out of range")
26+
1527
for i, item in enumerate(self):
1628
if i == index:
1729
return item
1830
raise IndexError("index out of range")
1931

32+
def _getslice(self, slice_object):
33+
34+
l = []
35+
36+
for i in xrange(*slice_object.indices(len(self))):
37+
l.append(self[i])
38+
return l
39+
2040
def __iter__(self):
2141
if self._clone_iter:
2242
return self._clone_iter()

tests/test_iterator.py

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ class TestFile(unittest.TestCase):
4040

4141
def test_len(self):
4242
f = aaf.open(main_test_file)
43-
44-
4543
iterable = f.storage.mobs()
4644

4745
assert len(iterable) == 199
@@ -55,10 +53,50 @@ def test_len(self):
5553
assert count == len(iterable)
5654
assert len(iterable) == 199
5755

58-
def test_skip(self):
56+
def test_negative_index(self):
57+
f = aaf.open(main_test_file)
58+
iterable = f.storage.mobs()
59+
60+
61+
last_item = iterable[len(iterable)-1]
62+
assert last_item == iterable[-1]
63+
64+
try:
65+
iterable[-10000]
66+
except IndexError:
67+
pass
68+
else:
69+
raise
70+
71+
for i in xrange(len(iterable)):
72+
assert iterable[i] == iterable[i-len(iterable)]
73+
74+
def test_slice(self):
5975
f = aaf.open(main_test_file)
76+
iterable = f.storage.mobs()
77+
78+
79+
s = iterable[1:10]
80+
l = []
81+
for i in xrange(1, 10):
82+
l.append(iterable[i])
83+
84+
assert s == l
85+
86+
s = iterable[100:-10:2]
6087

88+
l = []
6189

90+
for i in xrange(100, len(iterable)-10, 2):
91+
l.append(iterable[i])
92+
93+
assert s == l
94+
95+
l = iterable[-1000: 1000]
96+
97+
98+
def test_skip(self):
99+
f = aaf.open(main_test_file)
62100
iterable = f.storage.mobs()
63101

64102
assert len(iterable) == 199

0 commit comments

Comments
 (0)