Home | History | Annotate | Download | only in classes
      1 '''
      2 A class which presents the reverse of a sequence without duplicating it.
      3 From: "Steven D. Majewski" <sdm7g (at] elvis.med.virginia.edu>
      4 
      5 It works on mutable or inmutable sequences.
      6 
      7 >>> chars = list(Rev('Hello World!'))
      8 >>> print ''.join(chars)
      9 !dlroW olleH
     10 
     11 The .forw is so you can use anonymous sequences in __init__, and still
     12 keep a reference the forward sequence. )
     13 If you give it a non-anonymous mutable sequence, the reverse sequence
     14 will track the updated values. ( but not reassignment! - another
     15 good reason to use anonymous values in creating the sequence to avoid
     16 confusion. Maybe it should be change to copy input sequence to break
     17 the connection completely ? )
     18 
     19 >>> nnn = range(3)
     20 >>> rnn = Rev(nnn)
     21 >>> for n in rnn: print n
     22 ...
     23 2
     24 1
     25 0
     26 >>> for n in range(4, 6): nnn.append(n)   # update nnn
     27 ...
     28 >>> for n in rnn: print n     # prints reversed updated values
     29 ...
     30 5
     31 4
     32 2
     33 1
     34 0
     35 >>> nnn = nnn[1:-1]
     36 >>> nnn
     37 [1, 2, 4]
     38 >>> for n in rnn: print n     # prints reversed values of old nnn
     39 ...
     40 5
     41 4
     42 2
     43 1
     44 0
     45 
     46 #
     47 >>> WH = Rev('Hello World!')
     48 >>> print WH.forw, WH.back
     49 Hello World! !dlroW olleH
     50 >>> nnn = Rev(range(1, 10))
     51 >>> print nnn.forw
     52 [1, 2, 3, 4, 5, 6, 7, 8, 9]
     53 >>> print nnn.back
     54 [9, 8, 7, 6, 5, 4, 3, 2, 1]
     55 
     56 >>> rrr = Rev(nnn)
     57 >>> rrr
     58 <1, 2, 3, 4, 5, 6, 7, 8, 9>
     59 
     60 '''
     61 
     62 class Rev:
     63     def __init__(self, seq):
     64         self.forw = seq
     65         self.back = self
     66 
     67     def __len__(self):
     68         return len(self.forw)
     69 
     70     def __getitem__(self, j):
     71         return self.forw[-(j + 1)]
     72 
     73     def __repr__(self):
     74         seq = self.forw
     75         if isinstance(seq, list):
     76             wrap = '[]'
     77             sep = ', '
     78         elif isinstance(seq, tuple):
     79             wrap = '()'
     80             sep = ', '
     81         elif isinstance(seq, str):
     82             wrap = ''
     83             sep = ''
     84         else:
     85             wrap = '<>'
     86             sep = ', '
     87         outstrs = [str(item) for item in self.back]
     88         return wrap[:1] + sep.join(outstrs) + wrap[-1:]
     89 
     90 def _test():
     91     import doctest, Rev
     92     return doctest.testmod(Rev)
     93 
     94 if __name__ == "__main__":
     95     _test()
     96