Hello,

After learning about the new class behavior, I am trying to implement a circular type list where, for example, you can compare the nth value to the "(n+1)th" value without worrying about going past the end of the list. (An old approach might be to create a function that converts a given index to the real index (e.g. maps the "(n+1)th" value back to the 1st value), but I thought I would try subclassing the list behavior.)

Seeing an ASPN entry on circular lists (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52246), I first tried to define a "turn" method for the list. The following works

###
class ring(list):
        def turn(self, incr=1):
                tail=self[incr:]
                head = self[:incr]
                self[:] = tail+head

l=ring(range(10))
l.turn(5) #the list now has a turn method
print l   #--> [5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
###

Then I tried to redefine how the list is initialized, desiring to give it a "zero" attribute which will be used whenever an item from the list is requested. I'm hoping not to have work with slices of the list--I just change how it is accessed. BUT...it doesn't work. Apparently __getitem__ is not accessed in order to print the list; and Python crashes when I try to print a single element.

Am I trying to subclass the wrong aspects of the list?

###
class Ring(list):
        def __init__(self, l):
                self[:] = l
                self._zero = 0
                
        def turn(self, incr=1):
                self._zero+=incr

        def __getitem__(self, i):
                return self[(i-self._zero)%len(self)]

l=Ring(range(10))
print l
l.turn(5)
print l    #same as original
print l[0] #crashes python
###

/c


_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor

Reply via email to