@@ -70,7 +70,7 @@ class Fraction(numbers.Rational):
7070 __slots__ = ('_numerator' , '_denominator' )
7171
7272 # We're immutable, so use __new__ not __init__
73- def __new__ (cls , numerator = 0 , denominator = None ):
73+ def __new__ (cls , numerator = 0 , denominator = None , _normalize = True ):
7474 """Constructs a Rational.
7575
7676 Takes a string like '3/2' or '1.5', another Rational instance, a
@@ -165,9 +165,12 @@ def __new__(cls, numerator=0, denominator=None):
165165
166166 if denominator == 0 :
167167 raise ZeroDivisionError ('Fraction(%s, 0)' % numerator )
168- g = gcd (numerator , denominator )
169- self ._numerator = numerator // g
170- self ._denominator = denominator // g
168+ if _normalize :
169+ g = gcd (numerator , denominator )
170+ numerator //= g
171+ denominator //= g
172+ self ._numerator = numerator
173+ self ._denominator = denominator
171174 return self
172175
173176 @classmethod
@@ -453,10 +456,12 @@ def __pow__(a, b):
453456 power = b .numerator
454457 if power >= 0 :
455458 return Fraction (a ._numerator ** power ,
456- a ._denominator ** power )
459+ a ._denominator ** power ,
460+ _normalize = False )
457461 else :
458462 return Fraction (a ._denominator ** - power ,
459- a ._numerator ** - power )
463+ a ._numerator ** - power ,
464+ _normalize = False )
460465 else :
461466 # A fractional power will generally produce an
462467 # irrational number.
@@ -480,15 +485,15 @@ def __rpow__(b, a):
480485
481486 def __pos__ (a ):
482487 """+a: Coerces a subclass instance to Fraction"""
483- return Fraction (a ._numerator , a ._denominator )
488+ return Fraction (a ._numerator , a ._denominator , _normalize = False )
484489
485490 def __neg__ (a ):
486491 """-a"""
487- return Fraction (- a ._numerator , a ._denominator )
492+ return Fraction (- a ._numerator , a ._denominator , _normalize = False )
488493
489494 def __abs__ (a ):
490495 """abs(a)"""
491- return Fraction (abs (a ._numerator ), a ._denominator )
496+ return Fraction (abs (a ._numerator ), a ._denominator , _normalize = False )
492497
493498 def __trunc__ (a ):
494499 """trunc(a)"""
0 commit comments