Sunday, 4 March 2018

How to implement a minimal class that behaves like a sequence in Python?



I am looking for a sample minimal example of a class that mimics an immutable sequence in Python.



class MySequence()
...

a = MySequence()


len(a)

for i in a:
pass

a[0]


What are the methods that must be implemented?



Answer



If you just want to be able to iterate over your sequence, you just need to implement the __iter__ method returning an iterable. The easiest way to do this is to create a generator using the yield statement.



class MySequence(object):
def __iter__(self):
yield 1
yield 2
yield 3

for x in MySequence():

print x # prints 1, then 2, then 3


However, this will not enable things like MySequence()[1]. For that you need to implement the __getitem__ method, and should probably implement __len__ as well.



class MySequence(object):
def __len__(self):
return 3

def __getitem__(self, key):

if key == 0:
return 1
elif key == 1:
return 2
elif key == 2:
return 3
else:
raise IndexError()

s = new MySequence()


for i in range(len(s)):
print s[i] # prints 1, then 2, then 3

for x in s:
print x # prints 1, then 2, then 3


Notice that I omitted __iter__. As long as __getitem__ raises an IndexError when you try to get a value that's out-of-bounds, Python can use it for iteration. (I could still include __iter__ if I wanted to be clearer, or wanted non-standard iteration behaviour.)


No comments:

Post a Comment

casting - Why wasn't Tobey Maguire in The Amazing Spider-Man? - Movies & TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...