Commit 3a9b062f authored by Georg Brandl's avatar Georg Brandl

Manually merge r68096,68189 from 3.0 branch.

parent 3f5f8228
...@@ -109,7 +109,7 @@ class Fraction(numbers.Rational): ...@@ -109,7 +109,7 @@ class Fraction(numbers.Rational):
""" """
if isinstance(f, numbers.Integral): if isinstance(f, numbers.Integral):
f = float(f) return cls(f)
elif not isinstance(f, float): elif not isinstance(f, float):
raise TypeError("%s.from_float() only takes floats, not %r (%s)" % raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
(cls.__name__, f, type(f).__name__)) (cls.__name__, f, type(f).__name__))
......
...@@ -354,9 +354,12 @@ def nsmallest(n, iterable, key=None): ...@@ -354,9 +354,12 @@ def nsmallest(n, iterable, key=None):
Equivalent to: sorted(iterable, key=key)[:n] Equivalent to: sorted(iterable, key=key)[:n]
""" """
if key is None:
it = zip(iterable, count()) # decorate
result = _nsmallest(n, it)
return list(map(itemgetter(0), result)) # undecorate
in1, in2 = tee(iterable) in1, in2 = tee(iterable)
keys = in1 if key is None else map(key, in1) it = zip(map(key, in1), count(), in2) # decorate
it = zip(keys, count(), in2) # decorate
result = _nsmallest(n, it) result = _nsmallest(n, it)
return list(map(itemgetter(2), result)) # undecorate return list(map(itemgetter(2), result)) # undecorate
...@@ -366,9 +369,12 @@ def nlargest(n, iterable, key=None): ...@@ -366,9 +369,12 @@ def nlargest(n, iterable, key=None):
Equivalent to: sorted(iterable, key=key, reverse=True)[:n] Equivalent to: sorted(iterable, key=key, reverse=True)[:n]
""" """
if key is None:
it = zip(iterable, map(neg, count())) # decorate
result = _nlargest(n, it)
return list(map(itemgetter(0), result)) # undecorate
in1, in2 = tee(iterable) in1, in2 = tee(iterable)
keys = in1 if key is None else map(key, in1) it = zip(map(key, in1), map(neg, count()), in2) # decorate
it = zip(keys, map(neg, count()), in2) # decorate
result = _nlargest(n, it) result = _nlargest(n, it)
return list(map(itemgetter(2), result)) # undecorate return list(map(itemgetter(2), result)) # undecorate
......
...@@ -136,6 +136,8 @@ class FractionTest(unittest.TestCase): ...@@ -136,6 +136,8 @@ class FractionTest(unittest.TestCase):
def testFromFloat(self): def testFromFloat(self):
self.assertRaises(TypeError, F.from_float, 3+4j) self.assertRaises(TypeError, F.from_float, 3+4j)
self.assertEquals((10, 1), _components(F.from_float(10))) self.assertEquals((10, 1), _components(F.from_float(10)))
bigint = 1234567890123456789
self.assertEquals((bigint, 1), _components(F.from_float(bigint)))
self.assertEquals((0, 1), _components(F.from_float(-0.0))) self.assertEquals((0, 1), _components(F.from_float(-0.0)))
self.assertEquals((10, 1), _components(F.from_float(10.0))) self.assertEquals((10, 1), _components(F.from_float(10.0)))
self.assertEquals((-5, 2), _components(F.from_float(-2.5))) self.assertEquals((-5, 2), _components(F.from_float(-2.5)))
......
...@@ -92,9 +92,15 @@ Library ...@@ -92,9 +92,15 @@ Library
- Issue #4796: Added Decimal.from_float() and Context.create_decimal_from_float() - Issue #4796: Added Decimal.from_float() and Context.create_decimal_from_float()
to the decimal module. to the decimal module.
- Fractions.from_float() no longer loses precision for integers too big to
cast as floats.
- Issue #4812: add missing underscore prefix to some internal-use-only - Issue #4812: add missing underscore prefix to some internal-use-only
constants in the decimal module. (Dec_0 becomes _Dec_0, etc.) constants in the decimal module. (Dec_0 becomes _Dec_0, etc.)
- Issue 4790: The nsmallest() and nlargest() functions in the heapq module
did unnecessary work in the common case where no key function was specified.
- Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case - Issue #4702: Throwing a DistutilsPlatformError instead of IOError in case
no MSVC compiler is found under Windows. Original patch by Philip Jenvey. no MSVC compiler is found under Windows. Original patch by Philip Jenvey.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment