Fix missing semicolon
[python.git] / Demo / classes / Rev.py
blob7fd78e03ea5107a516312436074173ec424a6feb
1 '''
2 A class which presents the reverse of a sequence without duplicating it.
3 From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
5 It works on mutable or inmutable sequences.
7 >>> chars = list(Rev('Hello World!'))
8 >>> print ''.join(chars)
9 !dlroW olleH
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 ? )
19 >>> nnn = range(3)
20 >>> rnn = Rev(nnn)
21 >>> for n in rnn: print n
22 ...
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 ...
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 ...
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]
56 >>> rrr = Rev(nnn)
57 >>> rrr
58 <1, 2, 3, 4, 5, 6, 7, 8, 9>
60 '''
62 class Rev:
63 def __init__(self, seq):
64 self.forw = seq
65 self.back = self
67 def __len__(self):
68 return len(self.forw)
70 def __getitem__(self, j):
71 return self.forw[-(j + 1)]
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:]
90 def _test():
91 import doctest, Rev
92 return doctest.testmod(Rev)
94 if __name__ == "__main__":
95 _test()