diff -r ac176a69d188 Lib/ipaddress.py --- a/Lib/ipaddress.py Sun Dec 28 22:14:23 2014 -0600 +++ b/Lib/ipaddress.py Tue Dec 30 12:51:00 2014 +0200 @@ -563,6 +563,9 @@ class _IPAddressBase(_TotalOrderingMixin except ValueError: cls._report_invalid_netmask(ip_str) + def __reduce__(self): + return self.__class__, (str(self),) + class _BaseAddress(_IPAddressBase): diff -r ac176a69d188 Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py Sun Dec 28 22:14:23 2014 -0600 +++ b/Lib/test/test_ipaddress.py Tue Dec 30 12:51:00 2014 +0200 @@ -8,6 +8,7 @@ import unittest import re import contextlib import operator +import pickle import ipaddress @@ -82,6 +83,13 @@ class CommonTestMixin: self.assertRaises(TypeError, hex, self.factory(1)) self.assertRaises(TypeError, bytes, self.factory(1)) + def pickle_test(self, addr): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + x = self.factory(addr) + y = pickle.loads(pickle.dumps(x, proto)) + self.assertEqual(y, x) + class CommonTestMixin_v4(CommonTestMixin): @@ -247,6 +255,9 @@ class AddressTestCase_v4(BaseTestCase, C assertBadOctet("257.0.0.0", 257) assertBadOctet("192.168.0.999", 999) + def test_pickle(self): + self.pickle_test('192.0.2.1') + class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): factory = ipaddress.IPv6Address @@ -379,6 +390,9 @@ class AddressTestCase_v6(BaseTestCase, C assertBadPart("02001:db8::", "02001") assertBadPart('2001:888888::1', "888888") + def test_pickle(self): + self.pickle_test('2001:db8::') + class NetmaskTestMixin_v4(CommonTestMixin_v4): """Input validation on interfaces and networks is very similar""" @@ -446,6 +460,11 @@ class NetmaskTestMixin_v4(CommonTestMixi class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4): factory = ipaddress.IPv4Interface + def test_pickle(self): + self.pickle_test('192.0.2.0/27') + self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1 + self.pickle_test('192.0.2.0') # IPV4LENGTH + class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4): factory = ipaddress.IPv4Network @@ -500,6 +519,11 @@ class NetmaskTestMixin_v6(CommonTestMixi assertBadNetmask("::1", "pudding") assertBadNetmask("::", "::") + def test_pickle(self): + self.pickle_test('2001:db8::1000/124') + self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1 + self.pickle_test('2001:db8::1000') # IPV6LENGTH + class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6): factory = ipaddress.IPv6Interface