mirror of
https://github.com/python/cpython.git
synced 2025-12-04 08:34:25 +00:00
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.
This commit is contained in:
parent
37d3ff1487
commit
e0c3f5edc0
2 changed files with 9 additions and 14 deletions
|
|
@ -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):
|
||||||
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 @@
|
||||||
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:
|
||||||
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):
|
||||||
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):
|
||||||
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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue