Skip to content

Commit a2104b7

Browse files
ohwgilesserhiy-storchakaclaude
authored
gh-88178: Fix exploded IPv6 addresses with a scope ID (GH-25824)
IPv6Address.exploded raised AddressValueError, and IPv6Interface.exploded omitted the scope ID. Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 033fc47 commit a2104b7

3 files changed

Lines changed: 20 additions & 5 deletions

File tree

Lib/ipaddress.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,14 +1911,18 @@ def _explode_shorthand_ip_string(self):
19111911
elif isinstance(self, IPv6Interface):
19121912
ip_str = str(self.ip)
19131913
else:
1914-
ip_str = str(self)
1914+
ip_str = self._string_from_ip_int(self._ip)
19151915

19161916
ip_int = self._ip_int_from_string(ip_str)
19171917
hex_str = '%032x' % ip_int
1918-
parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
1919-
if isinstance(self, (_BaseNetwork, IPv6Interface)):
1920-
return '%s/%d' % (':'.join(parts), self._prefixlen)
1921-
return ':'.join(parts)
1918+
exploded = ':'.join([hex_str[x:x+4] for x in range(0, 32, 4)])
1919+
if isinstance(self, _BaseNetwork):
1920+
return '%s/%d' % (exploded, self._prefixlen)
1921+
if self._scope_id:
1922+
exploded = '%s%%%s' % (exploded, self._scope_id)
1923+
if isinstance(self, IPv6Interface):
1924+
return '%s/%d' % (exploded, self._prefixlen)
1925+
return exploded
19221926

19231927
def _reverse_pointer(self):
19241928
"""Return the reverse DNS pointer name for the IPv6 address.

Lib/test/test_ipaddress.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2718,6 +2718,12 @@ def testExplodeShortHandIpStr(self):
27182718
addr1.exploded)
27192719
self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
27202720
ipaddress.IPv6Interface('::1/128').exploded)
2721+
self.assertEqual('fe80:0000:0000:0000:0000:0000:0000:0001%1',
2722+
ipaddress.IPv6Address('fe80::1%1').exploded)
2723+
self.assertEqual('fe80:0000:0000:0000:0000:0000:0000:0001%eth0',
2724+
ipaddress.IPv6Address('fe80::1%eth0').exploded)
2725+
self.assertEqual('fe80:0000:0000:0000:0000:0000:0000:0001%1/64',
2726+
ipaddress.IPv6Interface('fe80::1%1/64').exploded)
27212727
# issue 77
27222728
self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
27232729
addr2.exploded)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
The ``exploded`` attribute of :class:`ipaddress.IPv6Address` and
2+
:class:`ipaddress.IPv6Interface` now supports addresses with a scope ID
3+
(link-local addresses).
4+
Previously the former raised :exc:`~ipaddress.AddressValueError`
5+
and the latter omitted the scope ID.

0 commit comments

Comments
 (0)