Mercurial > cpython-lru_cache-weakref
annotate Demo/classes/Rat.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 | dd7be8128410 |
| children | ba005e4db4c5 |
| rev | line source |
|---|---|
| 945 | 1 # Rational numbers |
| 2 | |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
3 from types import * |
| 945 | 4 |
| 5 def rat(num, den): | |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
6 if type(num) == FloatType or type(den) == FloatType: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
7 return num/den |
|
1427
8701b93383ab
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
1371
diff
changeset
|
8 return Rat(num, den) |
| 945 | 9 |
| 10 | |
| 11 def gcd(a, b): | |
| 12 while b: | |
| 13 a, b = b, a%b | |
| 14 return a | |
| 15 | |
| 16 | |
| 17 class Rat: | |
| 18 | |
|
1427
8701b93383ab
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
1371
diff
changeset
|
19 def __init__(self, num, den): |
| 945 | 20 if den == 0: |
| 21 raise ZeroDivisionError, 'rat(x, 0)' | |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
22 if type(den) == FloatType or type(num) == FloatType: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
23 g = float(den) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
24 else: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
25 g = gcd(num, den) |
| 945 | 26 self.num = num/g |
| 27 self.den = den/g | |
| 28 | |
| 29 def __repr__(self): | |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
30 return 'Rat(%s, %s)' % (self.num, self.den) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
31 |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
32 def __str__(self): |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
33 if self.den == 1: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
34 return str(self.num) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
35 else: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
36 return '%s/%s' % (self.num, self.den) |
| 945 | 37 |
| 38 def __cmp__(a, b): | |
| 39 c = a-b | |
| 40 if c.num < 0: | |
| 41 return -1 | |
| 42 if c.num > 0: | |
| 43 return 1 | |
| 44 return 0 | |
| 45 | |
| 46 def __float__(self): | |
| 47 return float(self.num) / float(self.den) | |
| 48 | |
| 49 def __long__(self): | |
| 50 return long(self.num) / long(self.den) | |
| 51 | |
| 52 def __int__(self): | |
| 53 return int(self.num / self.den) | |
| 54 | |
| 55 def __coerce__(a, b): | |
| 56 t = type(b) | |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
57 if t == IntType: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
58 return a, Rat(b, 1) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
59 if t == LongType: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
60 return a, Rat(b, 1L) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
61 if t == FloatType: |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
62 return a, Rat(b, 1.0) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
63 if t == InstanceType and a.__class__ == b.__class__: |
|
1427
8701b93383ab
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
1371
diff
changeset
|
64 return a, b |
| 945 | 65 raise TypeError, 'Rat.__coerce__: bad other arg' |
|
1427
8701b93383ab
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
1371
diff
changeset
|
66 |
| 945 | 67 def __add__(a, b): |
| 68 return rat(a.num*b.den + b.num*a.den, a.den*b.den) | |
| 69 | |
| 70 def __sub__(a, b): | |
| 71 return rat(a.num*b.den - b.num*a.den, a.den*b.den) | |
| 72 | |
| 73 def __mul__(a, b): | |
| 74 return rat(a.num*b.num, a.den*b.den) | |
| 75 | |
| 76 def __div__(a, b): | |
| 77 return rat(a.num*b.den, a.den*b.num) | |
| 78 | |
| 79 def __neg__(self): | |
| 80 return rat(-self.num, self.den) | |
| 81 | |
| 82 | |
| 83 def test(): | |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
84 print Rat(-1L, 1) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
85 print Rat(1, -1) |
|
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
86 a = Rat(1, 10) |
| 945 | 87 print int(a), long(a), float(a) |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
88 b = Rat(2, 5) |
| 945 | 89 l = [a+b, a-b, a*b, a/b] |
| 90 print l | |
| 91 l.sort() | |
| 92 print l | |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
93 print Rat(0, 1) |
| 945 | 94 print a+1 |
| 95 print a+1L | |
| 96 print a+1.0 | |
| 1371 | 97 try: |
|
1966
dd7be8128410
adapted to new overloading scheme
Guido van Rossum <guido@python.org>
parents:
1427
diff
changeset
|
98 print Rat(1, 0) |
| 1371 | 99 raise SystemError, 'should have been ZeroDivisionError' |
| 100 except ZeroDivisionError: | |
| 101 print 'OK' | |
| 945 | 102 |
|
1427
8701b93383ab
*** empty log message ***
Guido van Rossum <guido@python.org>
parents:
1371
diff
changeset
|
103 test() |
