Skip to content

Commit 761af88

Browse files
miss-islingtonohwgilesserhiy-storchakaclaude
authored
[3.13] gh-88178: Fix exploded IPv6 addresses with a scope ID (GH-25824) (GH-155657)
IPv6Address.exploded raised AddressValueError, and IPv6Interface.exploded omitted the scope ID. (cherry picked from commit a2104b7) Co-authored-by: Oliver Giles <ohw.giles@gmail.com> Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent ca39363 commit 761af88

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
@@ -1883,14 +1883,18 @@ def _explode_shorthand_ip_string(self):
18831883
elif isinstance(self, IPv6Interface):
18841884
ip_str = str(self.ip)
18851885
else:
1886-
ip_str = str(self)
1886+
ip_str = self._string_from_ip_int(self._ip)
18871887

18881888
ip_int = self._ip_int_from_string(ip_str)
18891889
hex_str = '%032x' % ip_int
1890-
parts = [hex_str[x:x+4] for x in range(0, 32, 4)]
1891-
if isinstance(self, (_BaseNetwork, IPv6Interface)):
1892-
return '%s/%d' % (':'.join(parts), self._prefixlen)
1893-
return ':'.join(parts)
1890+
exploded = ':'.join([hex_str[x:x+4] for x in range(0, 32, 4)])
1891+
if isinstance(self, _BaseNetwork):
1892+
return '%s/%d' % (exploded, self._prefixlen)
1893+
if self._scope_id:
1894+
exploded = '%s%%%s' % (exploded, self._scope_id)
1895+
if isinstance(self, IPv6Interface):
1896+
return '%s/%d' % (exploded, self._prefixlen)
1897+
return exploded
18941898

18951899
def _reverse_pointer(self):
18961900
"""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
@@ -2667,6 +2667,12 @@ def testExplodeShortHandIpStr(self):
26672667
addr1.exploded)
26682668
self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
26692669
ipaddress.IPv6Interface('::1/128').exploded)
2670+
self.assertEqual('fe80:0000:0000:0000:0000:0000:0000:0001%1',
2671+
ipaddress.IPv6Address('fe80::1%1').exploded)
2672+
self.assertEqual('fe80:0000:0000:0000:0000:0000:0000:0001%eth0',
2673+
ipaddress.IPv6Address('fe80::1%eth0').exploded)
2674+
self.assertEqual('fe80:0000:0000:0000:0000:0000:0000:0001%1/64',
2675+
ipaddress.IPv6Interface('fe80::1%1/64').exploded)
26702676
# issue 77
26712677
self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
26722678
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)