Kaydet (Commit) 933d3a7a authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Issue 4998: __slots__ on Fractions was useless.

üst e548d248
...@@ -17,6 +17,7 @@ class Number(object): ...@@ -17,6 +17,7 @@ class Number(object):
caring what kind, use isinstance(x, Number). caring what kind, use isinstance(x, Number).
""" """
__metaclass__ = ABCMeta __metaclass__ = ABCMeta
__slots__ = ()
# Concrete numeric types must provide their own hash implementation # Concrete numeric types must provide their own hash implementation
__hash__ = None __hash__ = None
...@@ -41,6 +42,8 @@ class Complex(Number): ...@@ -41,6 +42,8 @@ class Complex(Number):
type as described below. type as described below.
""" """
__slots__ = ()
@abstractmethod @abstractmethod
def __complex__(self): def __complex__(self):
"""Return a builtin complex instance. Called for complex(self).""" """Return a builtin complex instance. Called for complex(self)."""
...@@ -172,6 +175,8 @@ class Real(Complex): ...@@ -172,6 +175,8 @@ class Real(Complex):
Real also provides defaults for the derived operations. Real also provides defaults for the derived operations.
""" """
__slots__ = ()
@abstractmethod @abstractmethod
def __float__(self): def __float__(self):
"""Any Real can be converted to a native float object. """Any Real can be converted to a native float object.
...@@ -265,6 +270,8 @@ Real.register(float) ...@@ -265,6 +270,8 @@ Real.register(float)
class Rational(Real): class Rational(Real):
""".numerator and .denominator should be in lowest terms.""" """.numerator and .denominator should be in lowest terms."""
__slots__ = ()
@abstractproperty @abstractproperty
def numerator(self): def numerator(self):
raise NotImplementedError raise NotImplementedError
...@@ -288,6 +295,8 @@ class Rational(Real): ...@@ -288,6 +295,8 @@ class Rational(Real):
class Integral(Rational): class Integral(Rational):
"""Integral adds a conversion to long and the bit-string operations.""" """Integral adds a conversion to long and the bit-string operations."""
__slots__ = ()
@abstractmethod @abstractmethod
def __long__(self): def __long__(self):
"""long(self)""" """long(self)"""
......
...@@ -394,6 +394,11 @@ class FractionTest(unittest.TestCase): ...@@ -394,6 +394,11 @@ class FractionTest(unittest.TestCase):
self.assertEqual(id(r), id(copy(r))) self.assertEqual(id(r), id(copy(r)))
self.assertEqual(id(r), id(deepcopy(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(): def test_main():
run_unittest(FractionTest, GcdTest) run_unittest(FractionTest, GcdTest)
......
...@@ -145,6 +145,10 @@ Core and Builtins ...@@ -145,6 +145,10 @@ Core and Builtins
Library 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 heirarchy now has its own __slots__ declarations.
- Issue #3321: _multiprocessing.Connection() doesn't check handle; added checks - Issue #3321: _multiprocessing.Connection() doesn't check handle; added checks
for *nix machines for negative handles and large int handles. Without this check for *nix machines for negative handles and large int handles. Without this check
it is possible to segfault the interpreter. it is possible to segfault the interpreter.
......
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