summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2009-02-12 17:58:36 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2009-02-12 17:58:36 (GMT)
commitc28ad27dbb7e79486691c814d0c31b8da7ad2602 (patch)
tree3abd985279ffc0076e4d1bbd9367ab245a052c22
parentbc448664af5add9f76400c1a8aee0e4324bc609b (diff)
downloadcpython-c28ad27dbb7e79486691c814d0c31b8da7ad2602.zip
cpython-c28ad27dbb7e79486691c814d0c31b8da7ad2602.tar.gz
cpython-c28ad27dbb7e79486691c814d0c31b8da7ad2602.tar.bz2
Issue 4998: restore utility of __slots__ on Fraction.
(forward merge of r68813).
-rw-r--r--Lib/numbers.py10
-rw-r--r--Lib/test/test_fractions.py5
-rw-r--r--Misc/NEWS4
3 files changed, 19 insertions, 0 deletions
diff --git a/Lib/numbers.py b/Lib/numbers.py
index 827c253..82960f0 100644
--- a/Lib/numbers.py
+++ b/Lib/numbers.py
@@ -15,6 +15,8 @@ class Number(metaclass=ABCMeta):
If you just want to check if an argument x is a number, without
caring what kind, use isinstance(x, Number).
"""
+ __slots__ = ()
+
# Concrete numeric types must provide their own hash implementation
__hash__ = None
@@ -38,6 +40,8 @@ class Complex(Number):
type as described below.
"""
+ __slots__ = ()
+
@abstractmethod
def __complex__(self):
"""Return a builtin complex instance. Called for complex(self)."""
@@ -152,6 +156,8 @@ class Real(Complex):
Real also provides defaults for the derived operations.
"""
+ __slots__ = ()
+
@abstractmethod
def __float__(self):
"""Any Real can be converted to a native float object.
@@ -264,6 +270,8 @@ Real.register(float)
class Rational(Real):
""".numerator and .denominator should be in lowest terms."""
+ __slots__ = ()
+
@abstractproperty
def numerator(self):
raise NotImplementedError
@@ -287,6 +295,8 @@ class Rational(Real):
class Integral(Rational):
"""Integral adds a conversion to int and the bit-string operations."""
+ __slots__ = ()
+
@abstractmethod
def __int__(self):
"""int(self)"""
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 6851d2d..91fcd26 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -407,6 +407,11 @@ class FractionTest(unittest.TestCase):
self.assertEqual(id(r), id(copy(r)))
self.assertEqual(id(r), id(deepcopy(r)))
+ def test_slots(self):
+ # Issue 4998
+ r = F(13, 7)
+ self.assertRaises(AttributeError, setattr, r, 'a', 10)
+
def test_main():
run_unittest(FractionTest, GcdTest)
diff --git a/Misc/NEWS b/Misc/NEWS
index c31c1a7..33a1c98 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -163,6 +163,10 @@ Core and Builtins
Library
-------
+- Issue #4998: The memory saving effect of __slots__ had been lost on Fractions
+ which inherited from numbers.py which did not have __slots__ defined. The
+ numbers hierarchy now has its own __slots__ declarations.
+
- Issue #4631: Fix urlopen() result when an HTTP response uses chunked
encoding.