Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d4d95f8

Browse files
committed
Merged revisions 71832 via svnmerge from
svn+ssh://[email protected]/python/trunk ........ r71832 | mark.dickinson | 2009-04-24 14:56:07 +0100 (Fri, 24 Apr 2009) | 3 lines Issue #5812: The two-argument form of the Fraction constructor now accepts arbitrary Rational instances. ........
1 parent f21bd3c commit d4d95f8

3 files changed

Lines changed: 32 additions & 13 deletions

File tree

Lib/fractions.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class Fraction(numbers.Rational):
5454
__slots__ = ('_numerator', '_denominator')
5555

5656
# We're immutable, so use __new__ not __init__
57-
def __new__(cls, numerator=0, denominator=1):
57+
def __new__(cls, numerator=0, denominator=None):
5858
"""Constructs a Rational.
5959
6060
Takes a string like '3/2' or '1.5', another Rational, or a
@@ -63,8 +63,13 @@ def __new__(cls, numerator=0, denominator=1):
6363
"""
6464
self = super(Fraction, cls).__new__(cls)
6565

66-
if not isinstance(numerator, int) and denominator == 1:
67-
if isinstance(numerator, str):
66+
if denominator is None:
67+
if isinstance(numerator, numbers.Rational):
68+
self._numerator = numerator.numerator
69+
self._denominator = numerator.denominator
70+
return self
71+
72+
elif isinstance(numerator, str):
6873
# Handle construction from strings.
6974
m = _RATIONAL_FORMAT.match(numerator)
7075
if m is None:
@@ -91,18 +96,22 @@ def __new__(cls, numerator=0, denominator=1):
9196
if m.group('sign') == '-':
9297
numerator = -numerator
9398

94-
elif isinstance(numerator, numbers.Rational):
95-
# Handle copies from other rationals. Integrals get
96-
# caught here too, but it doesn't matter because
97-
# denominator is already 1.
98-
other_rational = numerator
99-
numerator = other_rational.numerator
100-
denominator = other_rational.denominator
99+
else:
100+
raise TypeError("argument should be a string "
101+
"or a Rational instance")
102+
103+
elif (isinstance(numerator, numbers.Rational) and
104+
isinstance(denominator, numbers.Rational)):
105+
numerator, denominator = (
106+
numerator.numerator * denominator.denominator,
107+
denominator.numerator * numerator.denominator
108+
)
109+
else:
110+
raise TypeError("both arguments should be "
111+
"Rational instances")
101112

102113
if denominator == 0:
103114
raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
104-
numerator = operator.index(numerator)
105-
denominator = operator.index(denominator)
106115
g = gcd(numerator, denominator)
107116
self._numerator = numerator // g
108117
self._denominator = denominator // g

Lib/test/test_fractions.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,19 @@ def testInit(self):
6060
self.assertEquals((7, 15), _components(F(7, 15)))
6161
self.assertEquals((10**23, 1), _components(F(10**23)))
6262

63+
self.assertEquals((3, 77), _components(F(F(3, 7), 11)))
64+
self.assertEquals((-9, 5), _components(F(2, F(-10, 9))))
65+
self.assertEquals((2486, 2485), _components(F(F(22, 7), F(355, 113))))
66+
6367
self.assertRaisesMessage(ZeroDivisionError, "Fraction(12, 0)",
6468
F, 12, 0)
6569
self.assertRaises(TypeError, F, 1.5)
6670
self.assertRaises(TypeError, F, 1.5 + 3j)
6771

68-
self.assertRaises(TypeError, F, F(1, 2), 3)
6972
self.assertRaises(TypeError, F, "3/2", 3)
73+
self.assertRaises(TypeError, F, 3, 0j)
74+
self.assertRaises(TypeError, F, 3, 1j)
75+
7076

7177
def testFromString(self):
7278
self.assertEquals((5, 1), _components(F("5")))

Misc/NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ Core and Builtins
7777
Library
7878
-------
7979

80+
- Issue #5812: For the two-argument form of the Fraction constructor,
81+
Fraction(m, n), m and n are permitted to be arbitrary Rational
82+
instances.
83+
8084
- Issue #5812: Fraction('1e6') is valid: more generally, any string
8185
that's valid for float() is now valid for Fraction(), with the
8286
exception of strings representing NaNs and infinities.

0 commit comments

Comments
 (0)