@@ -125,17 +125,9 @@ def __new__(cls, numerator=0, denominator=None, _normalize=True):
125125 self ._denominator = numerator .denominator
126126 return self
127127
128- elif isinstance (numerator , float ):
129- # Exact conversion from float
130- value = Fraction .from_float (numerator )
131- self ._numerator = value ._numerator
132- self ._denominator = value ._denominator
133- return self
134-
135- elif isinstance (numerator , Decimal ):
136- value = Fraction .from_decimal (numerator )
137- self ._numerator = value ._numerator
138- self ._denominator = value ._denominator
128+ elif isinstance (numerator , (float , Decimal )):
129+ # Exact conversion
130+ self ._numerator , self ._denominator = numerator .as_integer_ratio ()
139131 return self
140132
141133 elif isinstance (numerator , str ):
@@ -210,10 +202,6 @@ def from_float(cls, f):
210202 elif not isinstance (f , float ):
211203 raise TypeError ("%s.from_float() only takes floats, not %r (%s)" %
212204 (cls .__name__ , f , type (f ).__name__ ))
213- if math .isnan (f ):
214- raise ValueError ("Cannot convert %r to %s." % (f , cls .__name__ ))
215- if math .isinf (f ):
216- raise OverflowError ("Cannot convert %r to %s." % (f , cls .__name__ ))
217205 return cls (* f .as_integer_ratio ())
218206
219207 @classmethod
@@ -226,19 +214,7 @@ def from_decimal(cls, dec):
226214 raise TypeError (
227215 "%s.from_decimal() only takes Decimals, not %r (%s)" %
228216 (cls .__name__ , dec , type (dec ).__name__ ))
229- if dec .is_infinite ():
230- raise OverflowError (
231- "Cannot convert %s to %s." % (dec , cls .__name__ ))
232- if dec .is_nan ():
233- raise ValueError ("Cannot convert %s to %s." % (dec , cls .__name__ ))
234- sign , digits , exp = dec .as_tuple ()
235- digits = int ('' .join (map (str , digits )))
236- if sign :
237- digits = - digits
238- if exp >= 0 :
239- return cls (digits * 10 ** exp )
240- else :
241- return cls (digits , 10 ** - exp )
217+ return cls (* dec .as_integer_ratio ())
242218
243219 def limit_denominator (self , max_denominator = 1000000 ):
244220 """Closest Fraction to self with denominator at most max_denominator.
0 commit comments