Skip to content

Commit

Permalink
pythongh-109466: Add ipv6_mapped property to IPv4Address (python#109467)
Browse files Browse the repository at this point in the history
Adds the `IPv4Address.ipv6_mapped` property.

Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
  • Loading branch information
csm10495 and hugovk committed Nov 5, 2023
1 parent 24b5cbd commit ba8aa1f
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Doc/library/ipaddress.rst
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,13 @@ write code that handles both IP versions correctly. Address objects are
``True`` if the address is reserved for link-local usage. See
:RFC:`3927`.

.. attribute:: ipv6_mapped

:class:`IPv4Address` object representing the IPv4-mapped IPv6 address. See :RFC:`4291`.

.. versionadded:: 3.13


.. _iana-ipv4-special-registry: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
.. _iana-ipv6-special-registry: https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml

Expand Down
6 changes: 6 additions & 0 deletions Doc/whatsnew/3.13.rst
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,12 @@ and only logged in :ref:`Python Development Mode <devmode>` or on :ref:`Python
built on debug mode <debug-build>`.
(Contributed by Victor Stinner in :gh:`62948`.)

ipaddress
---------

* Add the :attr:`ipaddress.IPv4Address.ipv6_mapped` property, which returns the IPv4-mapped IPv6 address.
(Contributed by Charles Machalow in :gh:`109466`.)

opcode
------

Expand Down
10 changes: 10 additions & 0 deletions Lib/ipaddress.py
Original file line number Diff line number Diff line change
Expand Up @@ -1389,6 +1389,16 @@ def is_link_local(self):
"""
return self in self._constants._linklocal_network

@property
def ipv6_mapped(self):
"""Return the IPv4-mapped IPv6 address.
Returns:
The IPv4-mapped IPv6 address per RFC 4291.
"""
return IPv6Address(f'::ffff:{self}')


class IPv4Interface(IPv4Address):

Expand Down
8 changes: 8 additions & 0 deletions Lib/test/test_ipaddress.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,14 @@ def test_pickle(self):
def test_weakref(self):
weakref.ref(self.factory('192.0.2.1'))

def test_ipv6_mapped(self):
self.assertEqual(ipaddress.IPv4Address('192.168.1.1').ipv6_mapped,
ipaddress.IPv6Address('::ffff:192.168.1.1'))
self.assertEqual(ipaddress.IPv4Address('192.168.1.1').ipv6_mapped,
ipaddress.IPv6Address('::ffff:c0a8:101'))
self.assertEqual(ipaddress.IPv4Address('192.168.1.1').ipv6_mapped.ipv4_mapped,
ipaddress.IPv4Address('192.168.1.1'))


class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
factory = ipaddress.IPv6Address
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add the :attr:`ipaddress.IPv4Address.ipv6_mapped` property, which retuns the IPv4-mapped IPv6 address.

0 comments on commit ba8aa1f

Please sign in to comment.