Kaydet (Commit) e0c3f5ed authored tarafından Nick Coghlan's avatar Nick Coghlan

Close #15559: Implementing __index__ creates a nasty interaction with the bytes…

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.
üst 37d3ff14
...@@ -511,9 +511,6 @@ class _BaseAddress(_IPAddressBase): ...@@ -511,9 +511,6 @@ class _BaseAddress(_IPAddressBase):
and '/' in str(address)): and '/' in str(address)):
raise AddressValueError("Unexpected '/' in %r" % address) raise AddressValueError("Unexpected '/' in %r" % address)
def __index__(self):
return self._ip
def __int__(self): def __int__(self):
return self._ip return self._ip
...@@ -571,9 +568,6 @@ class _BaseNetwork(_IPAddressBase): ...@@ -571,9 +568,6 @@ class _BaseNetwork(_IPAddressBase):
def __init__(self, address): def __init__(self, address):
self._cache = {} self._cache = {}
def __index__(self):
return int(self.network_address) ^ self.prefixlen
def __int__(self): def __int__(self):
return int(self.network_address) return int(self.network_address)
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import unittest import unittest
import re import re
import contextlib import contextlib
import operator
import ipaddress import ipaddress
class BaseTestCase(unittest.TestCase): class BaseTestCase(unittest.TestCase):
...@@ -72,6 +73,14 @@ class CommonTestMixin: ...@@ -72,6 +73,14 @@ class CommonTestMixin:
with self.assertAddressError(re.escape(repr("1.0"))): with self.assertAddressError(re.escape(repr("1.0"))):
self.factory(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): class CommonTestMixin_v4(CommonTestMixin):
def test_leading_zeros(self): def test_leading_zeros(self):
...@@ -599,7 +608,6 @@ class IpaddrUnitTest(unittest.TestCase): ...@@ -599,7 +608,6 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertEqual(first, last) self.assertEqual(first, last)
self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128)) self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network)) self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
self.assertEqual('0x1020318', hex(self.ipv4_network))
def testMissingAddressVersion(self): def testMissingAddressVersion(self):
class Broken(ipaddress._BaseAddress): class Broken(ipaddress._BaseAddress):
...@@ -1545,13 +1553,6 @@ class IpaddrUnitTest(unittest.TestCase): ...@@ -1545,13 +1553,6 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertEqual(42540616829182469433547762482097946625, self.assertEqual(42540616829182469433547762482097946625,
int(self.ipv6_address)) 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): def testForceVersion(self):
self.assertEqual(ipaddress.ip_network(1).version, 4) self.assertEqual(ipaddress.ip_network(1).version, 4)
self.assertEqual(ipaddress.IPv6Network(1).version, 6) self.assertEqual(ipaddress.IPv6Network(1).version, 6)
......
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