changeset: 94894:88a5c1698ca4 user: Serhiy Storchaka date: Sat Mar 07 20:08:34 2015 +0200 files: Lib/ipaddress.py Lib/test/test_ipaddress.py Misc/NEWS description: Issue #23103: Reduced the memory consumption of IPv4Address and IPv6Address. diff -r 76732273a8ac -r 88a5c1698ca4 Lib/ipaddress.py --- a/Lib/ipaddress.py Sat Mar 07 09:34:49 2015 -0500 +++ b/Lib/ipaddress.py Sat Mar 07 20:08:34 2015 +0200 @@ -386,6 +386,8 @@ """The mother class.""" + __slots__ = () + @property def exploded(self): """Return the longhand version of the IP address as a string.""" @@ -543,6 +545,8 @@ used by single IP addresses. """ + __slots__ = () + def __int__(self): return self._ip @@ -1051,6 +1055,8 @@ """ + __slots__ = () + _version = 4 # Equivalent to 255.255.255.255 or 32 bits of 1's. _ALL_ONES = (2**IPV4LENGTH) - 1 _DECIMAL_DIGITS = frozenset('0123456789') @@ -1063,9 +1069,6 @@ # when constructed (see _make_netmask()). _netmask_cache = {} - def __init__(self, address): - self._version = 4 - def _explode_shorthand_ip_string(self): return str(self) @@ -1243,6 +1246,8 @@ """Represent and manipulate single IPv4 Addresses.""" + __slots__ = ('_ip', '__weakref__') + def __init__(self, address): """ @@ -1259,8 +1264,6 @@ AddressValueError: If ipaddress isn't a valid IPv4 address. """ - _BaseV4.__init__(self, address) - # Efficient constructor from integer. if isinstance(address, int): self._check_int_address(address) @@ -1485,8 +1488,6 @@ supplied. """ - - _BaseV4.__init__(self, address) _BaseNetwork.__init__(self, address) # Constructing from a packed address or integer @@ -1590,6 +1591,8 @@ """ + __slots__ = () + _version = 6 _ALL_ONES = (2**IPV6LENGTH) - 1 _HEXTET_COUNT = 8 _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') @@ -1599,9 +1602,6 @@ # when constructed (see _make_netmask()). _netmask_cache = {} - def __init__(self, address): - self._version = 6 - @classmethod def _make_netmask(cls, arg): """Make a (netmask, prefix_len) tuple from the given argument. @@ -1870,6 +1870,8 @@ """Represent and manipulate single IPv6 Addresses.""" + __slots__ = ('_ip', '__weakref__') + def __init__(self, address): """Instantiate a new IPv6 address object. @@ -1887,8 +1889,6 @@ AddressValueError: If address isn't a valid IPv6 address. """ - _BaseV6.__init__(self, address) - # Efficient constructor from integer. if isinstance(address, int): self._check_int_address(address) @@ -2180,7 +2180,6 @@ supplied. """ - _BaseV6.__init__(self, address) _BaseNetwork.__init__(self, address) # Efficient constructor from integer or packed address diff -r 76732273a8ac -r 88a5c1698ca4 Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py Sat Mar 07 09:34:49 2015 -0500 +++ b/Lib/test/test_ipaddress.py Sat Mar 07 20:08:34 2015 +0200 @@ -11,6 +11,7 @@ import operator import pickle import ipaddress +import weakref class BaseTestCase(unittest.TestCase): @@ -259,6 +260,9 @@ def test_pickle(self): self.pickle_test('192.0.2.1') + def test_weakref(self): + weakref.ref(self.factory('192.0.2.1')) + class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): factory = ipaddress.IPv6Address @@ -394,6 +398,9 @@ def test_pickle(self): self.pickle_test('2001:db8::') + def test_weakref(self): + weakref.ref(self.factory('2001:db8::')) + class NetmaskTestMixin_v4(CommonTestMixin_v4): """Input validation on interfaces and networks is very similar""" diff -r 76732273a8ac -r 88a5c1698ca4 Misc/NEWS --- a/Misc/NEWS Sat Mar 07 09:34:49 2015 -0500 +++ b/Misc/NEWS Sat Mar 07 20:08:34 2015 +0200 @@ -17,6 +17,8 @@ Library ------- +- Issue #23103: Reduced the memory consumption of IPv4Address and IPv6Address. + - Issue #21793: BaseHTTPRequestHandler again logs response code as numeric, not as stringified enum. Patch by Demian Brecht.