@@ -183,7 +183,7 @@ class Fraction(numbers.Rational):
183
183
__slots__ = ('_numerator' , '_denominator' )
184
184
185
185
# We're immutable, so use __new__ not __init__
186
- def __new__ (cls , numerator = 0 , denominator = None , * , _normalize = True ):
186
+ def __new__ (cls , numerator = 0 , denominator = None ):
187
187
"""Constructs a Rational.
188
188
189
189
Takes a string like '3/2' or '1.5', another Rational instance, a
@@ -279,12 +279,11 @@ def __new__(cls, numerator=0, denominator=None, *, _normalize=True):
279
279
280
280
if denominator == 0 :
281
281
raise ZeroDivisionError ('Fraction(%s, 0)' % numerator )
282
- if _normalize :
283
- g = math .gcd (numerator , denominator )
284
- if denominator < 0 :
285
- g = - g
286
- numerator //= g
287
- denominator //= g
282
+ g = math .gcd (numerator , denominator )
283
+ if denominator < 0 :
284
+ g = - g
285
+ numerator //= g
286
+ denominator //= g
288
287
self ._numerator = numerator
289
288
self ._denominator = denominator
290
289
return self
@@ -315,6 +314,13 @@ def from_decimal(cls, dec):
315
314
(cls .__name__ , dec , type (dec ).__name__ ))
316
315
return cls (* dec .as_integer_ratio ())
317
316
317
+ @classmethod
318
+ def _from_pair (cls , num , den ):
319
+ obj = super (Fraction , cls ).__new__ (cls )
320
+ obj ._numerator = num
321
+ obj ._denominator = den
322
+ return obj
323
+
318
324
def is_integer (self ):
319
325
"""Return True if the Fraction is an integer."""
320
326
return self ._denominator == 1
@@ -380,9 +386,9 @@ def limit_denominator(self, max_denominator=1000000):
380
386
# the distance from p1/q1 to self is d/(q1*self._denominator). So we
381
387
# need to compare 2*(q0+k*q1) with self._denominator/d.
382
388
if 2 * d * (q0 + k * q1 ) <= self ._denominator :
383
- return Fraction (p1 , q1 , _normalize = False )
389
+ return Fraction . _from_pair (p1 , q1 )
384
390
else :
385
- return Fraction (p0 + k * p1 , q0 + k * q1 , _normalize = False )
391
+ return Fraction . _from_pair (p0 + k * p1 , q0 + k * q1 )
386
392
387
393
@property
388
394
def numerator (a ):
@@ -703,13 +709,13 @@ def _add(a, b):
703
709
nb , db = b ._numerator , b ._denominator
704
710
g = math .gcd (da , db )
705
711
if g == 1 :
706
- return Fraction (na * db + da * nb , da * db , _normalize = False )
712
+ return Fraction . _from_pair (na * db + da * nb , da * db )
707
713
s = da // g
708
714
t = na * (db // g ) + nb * s
709
715
g2 = math .gcd (t , g )
710
716
if g2 == 1 :
711
- return Fraction (t , s * db , _normalize = False )
712
- return Fraction (t // g2 , s * (db // g2 ), _normalize = False )
717
+ return Fraction . _from_pair (t , s * db )
718
+ return Fraction . _from_pair (t // g2 , s * (db // g2 ))
713
719
714
720
__add__ , __radd__ = _operator_fallbacks (_add , operator .add )
715
721
@@ -719,13 +725,13 @@ def _sub(a, b):
719
725
nb , db = b ._numerator , b ._denominator
720
726
g = math .gcd (da , db )
721
727
if g == 1 :
722
- return Fraction (na * db - da * nb , da * db , _normalize = False )
728
+ return Fraction . _from_pair (na * db - da * nb , da * db )
723
729
s = da // g
724
730
t = na * (db // g ) - nb * s
725
731
g2 = math .gcd (t , g )
726
732
if g2 == 1 :
727
- return Fraction (t , s * db , _normalize = False )
728
- return Fraction (t // g2 , s * (db // g2 ), _normalize = False )
733
+ return Fraction . _from_pair (t , s * db )
734
+ return Fraction . _from_pair (t // g2 , s * (db // g2 ))
729
735
730
736
__sub__ , __rsub__ = _operator_fallbacks (_sub , operator .sub )
731
737
@@ -741,15 +747,17 @@ def _mul(a, b):
741
747
if g2 > 1 :
742
748
nb //= g2
743
749
da //= g2
744
- return Fraction (na * nb , db * da , _normalize = False )
750
+ return Fraction . _from_pair (na * nb , db * da )
745
751
746
752
__mul__ , __rmul__ = _operator_fallbacks (_mul , operator .mul )
747
753
748
754
def _div (a , b ):
749
755
"""a / b"""
750
756
# Same as _mul(), with inversed b.
751
- na , da = a ._numerator , a ._denominator
752
757
nb , db = b ._numerator , b ._denominator
758
+ if nb == 0 :
759
+ raise ZeroDivisionError ('Fraction(%s, 0)' % db )
760
+ na , da = a ._numerator , a ._denominator
753
761
g1 = math .gcd (na , nb )
754
762
if g1 > 1 :
755
763
na //= g1
@@ -761,7 +769,7 @@ def _div(a, b):
761
769
n , d = na * db , nb * da
762
770
if d < 0 :
763
771
n , d = - n , - d
764
- return Fraction (n , d , _normalize = False )
772
+ return Fraction . _from_pair (n , d )
765
773
766
774
__truediv__ , __rtruediv__ = _operator_fallbacks (_div , operator .truediv )
767
775
@@ -798,17 +806,17 @@ def __pow__(a, b):
798
806
if b .denominator == 1 :
799
807
power = b .numerator
800
808
if power >= 0 :
801
- return Fraction (a ._numerator ** power ,
802
- a ._denominator ** power ,
803
- _normalize = False )
804
- elif a ._numerator >= 0 :
805
- return Fraction (a ._denominator ** - power ,
806
- a ._numerator ** - power ,
807
- _normalize = False )
809
+ return Fraction ._from_pair (a ._numerator ** power ,
810
+ a ._denominator ** power )
811
+ elif a ._numerator > 0 :
812
+ return Fraction ._from_pair (a ._denominator ** - power ,
813
+ a ._numerator ** - power )
814
+ elif a ._numerator == 0 :
815
+ raise ZeroDivisionError ('Fraction(%s, 0)' %
816
+ a ._denominator ** - power )
808
817
else :
809
- return Fraction ((- a ._denominator ) ** - power ,
810
- (- a ._numerator ) ** - power ,
811
- _normalize = False )
818
+ return Fraction ._from_pair ((- a ._denominator ) ** - power ,
819
+ (- a ._numerator ) ** - power )
812
820
else :
813
821
# A fractional power will generally produce an
814
822
# irrational number.
@@ -832,15 +840,15 @@ def __rpow__(b, a):
832
840
833
841
def __pos__ (a ):
834
842
"""+a: Coerces a subclass instance to Fraction"""
835
- return Fraction (a ._numerator , a ._denominator , _normalize = False )
843
+ return Fraction . _from_pair (a ._numerator , a ._denominator )
836
844
837
845
def __neg__ (a ):
838
846
"""-a"""
839
- return Fraction (- a ._numerator , a ._denominator , _normalize = False )
847
+ return Fraction . _from_pair (- a ._numerator , a ._denominator )
840
848
841
849
def __abs__ (a ):
842
850
"""abs(a)"""
843
- return Fraction (abs (a ._numerator ), a ._denominator , _normalize = False )
851
+ return Fraction . _from_pair (abs (a ._numerator ), a ._denominator )
844
852
845
853
def __int__ (a , _index = operator .index ):
846
854
"""int(a)"""
0 commit comments