[Python-checkins] cpython: Close #15559: Implementing __index__ creates a nasty interaction with the bytes

nick.coghlan python-checkins at python.org
Sun Aug 5 10:20:36 CEST 2012


http://hg.python.org/cpython/rev/5abea8a43f19
changeset:   78426:5abea8a43f19
user:        Nick Coghlan <ncoghlan at gmail.com>
date:        Sun Aug 05 18:20:17 2012 +1000
summary:
  Close #15559: Implementing __index__ creates a nasty interaction with the bytes constructor. At least for 3.3, ipaddress objects must now be explicitly converted with int() and thus can't be passed directly to the hex() builtin.

files:
  Lib/ipaddress.py           |   6 ------
  Lib/test/test_ipaddress.py |  17 +++++++++--------
  2 files changed, 9 insertions(+), 14 deletions(-)


diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -511,9 +511,6 @@
             and '/' in str(address)):
             raise AddressValueError("Unexpected '/' in %r" % address)
 
-    def __index__(self):
-        return self._ip
-
     def __int__(self):
         return self._ip
 
@@ -571,9 +568,6 @@
     def __init__(self, address):
         self._cache = {}
 
-    def __index__(self):
-        return int(self.network_address) ^ self.prefixlen
-
     def __int__(self):
         return int(self.network_address)
 
diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py
--- a/Lib/test/test_ipaddress.py
+++ b/Lib/test/test_ipaddress.py
@@ -7,6 +7,7 @@
 import unittest
 import re
 import contextlib
+import operator
 import ipaddress
 
 class BaseTestCase(unittest.TestCase):
@@ -72,6 +73,14 @@
         with self.assertAddressError(re.escape(repr("1.0"))):
             self.factory(1.0)
 
+    def test_not_an_index_issue15559(self):
+        # Implementing __index__ makes for a very nasty interaction with the
+        # bytes constructor. Thus, we disallow implicit use as an integer
+        self.assertRaises(TypeError, operator.index, self.factory(1))
+        self.assertRaises(TypeError, hex, self.factory(1))
+        self.assertRaises(TypeError, bytes, self.factory(1))
+
+
 class CommonTestMixin_v4(CommonTestMixin):
 
     def test_leading_zeros(self):
@@ -599,7 +608,6 @@
         self.assertEqual(first, last)
         self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
         self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
-        self.assertEqual('0x1020318', hex(self.ipv4_network))
 
     def testMissingAddressVersion(self):
         class Broken(ipaddress._BaseAddress):
@@ -1545,13 +1553,6 @@
         self.assertEqual(42540616829182469433547762482097946625,
                          int(self.ipv6_address))
 
-    def testHexRepresentation(self):
-        self.assertEqual(hex(0x1020304),
-                         hex(self.ipv4_address))
-
-        self.assertEqual(hex(0x20010658022ACAFE0200000000000001),
-                         hex(self.ipv6_address))
-
     def testForceVersion(self):
         self.assertEqual(ipaddress.ip_network(1).version, 4)
         self.assertEqual(ipaddress.IPv6Network(1).version, 6)

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list