Mercurial > cpython-lru_cache-weakref
annotate Demo/classes/Rev.py @ 4566:6403c94de50d legacy-trunk
Added safeguard against failure in __del__.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 27 Nov 1996 19:39:58 +0000 |
| parents | 8701b93383ab |
| children | 558689b6d7f0 |
| rev | line source |
|---|---|
| 1378 | 1 # A class which presents the reverse of a sequence without duplicating it. |
| 2 # From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu> | |
| 3 | |
| 4 # It works on mutable or inmutable sequences. | |
| 5 # | |
| 6 # >>> for c in Rev( 'Hello World!' ) : sys.stdout.write( c ) | |
| 7 # ... else: sys.stdout.write( '\n' ) | |
| 8 # ... | |
| 9 # !dlroW olleH | |
| 10 # | |
|
1427
8701b93383ab
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
1378
diff
changeset
|
11 # The .forw is so you can use anonymous sequences in __init__, and still |
| 1378 | 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( 0, 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 # nnn = Rev( range( 1, 10 ) ) | |
| 50 # print nnn.forw | |
| 51 # print nnn | |
| 52 # | |
| 53 # produces output: | |
| 54 # | |
| 55 # Hello World! !dlroW olleH | |
| 56 # [1, 2, 3, 4, 5, 6, 7, 8, 9] | |
| 57 # [9, 8, 7, 6, 5, 4, 3, 2, 1] | |
| 58 # | |
| 59 # >>>rrr = Rev( nnn ) | |
| 60 # >>>rrr | |
| 61 # <1, 2, 3, 4, 5, 6, 7, 8, 9> | |
| 62 | |
| 63 from string import joinfields | |
| 64 class Rev: | |
| 65 def __init__( self, seq ): | |
| 66 self.forw = seq | |
| 67 self.back = self | |
| 68 def __len__( self ): | |
| 69 return len( self.forw ) | |
| 70 def __getitem__( self, j ): | |
| 71 return self.forw[ -( j + 1 ) ] | |
| 72 def __repr__( self ): | |
| 73 seq = self.forw | |
| 74 if type(seq) == type( [] ) : | |
| 75 wrap = '[]' | |
| 76 sep = ', ' | |
| 77 elif type(seq) == type( () ) : | |
| 78 wrap = '()' | |
| 79 sep = ', ' | |
| 80 elif type(seq) == type( '' ) : | |
| 81 wrap = '' | |
| 82 sep = '' | |
| 83 else: | |
| 84 wrap = '<>' | |
| 85 sep = ', ' | |
| 86 outstrs = [] | |
| 87 for item in self.back : | |
| 88 outstrs.append( str( item ) ) | |
| 89 return wrap[:1] + joinfields( outstrs, sep ) + wrap[-1:] |
