:mod:`ipaddress` --- IPv4/IPv6 manipulation library
===================================================

.. module:: ipaddress
   :synopsis: IPv4/IPv6 manipulation library.

.. moduleauthor:: Peter Moody

**Source code:** :source:`Lib/ipaddress.py`

--------------

:mod:`ipaddress` provides the capabilities to create, manipulate and
operate on IPv4 and IPv6 addresses and networks.

The functions and classes in this module make it straightforward to handle
various tasks related to IP addresses, including checking whether or not two
hosts are on the same subnet, iterating over all hosts in a particular
subnet, checking whether or not a string represents a valid IP address or
network definition, and so on.

This is the full module API reference—for an overview and introduction, see
:ref:`ipaddress-howto`.

.. versionadded:: 3.3

.. testsetup::

   import ipaddress
   from ipaddress import (
       ip_network, IPv4Address, IPv4Interface, IPv4Network,
   )

Convenience factory functions
-----------------------------

The :mod:`ipaddress` module provides factory functions to conveniently create
IP addresses, networks and interfaces:

.. function:: ip_address(address)

   Return an :class:`IPv4Address` or :class:`IPv6Address` object depending on
   the IP address passed as argument.  Either IPv4 or IPv6 addresses may be
   supplied; integers less than 2**32 will be considered to be IPv4 by default.
   A :exc:`ValueError` is raised if *address* does not represent a valid IPv4
   or IPv6 address.

   >>> ipaddress.ip_address('192.168.0.1')
   IPv4Address('192.168.0.1')
   >>> ipaddress.ip_address('2001:db8::')
   IPv6Address('2001:db8::')


.. function:: ip_network(address, strict=True)

   Return an :class:`IPv4Network` or :class:`IPv6Network` object depending on
   the IP address passed as argument.  *address* is a string or integer
   representing the IP network.  Either IPv4 or IPv6 networks may be supplied;
   integers less than 2**32 will be considered to be IPv4 by default.  *strict*
   is passed to :class:`IPv4Network` or :class:`IPv6Network` constructor.  A
   :exc:`ValueError` is raised if *address* does not represent a valid IPv4 or
   IPv6 address, or if the network has host bits set.

   >>> ipaddress.ip_network('192.168.0.0/28')
   IPv4Network('192.168.0.0/28')


.. function:: ip_interface(address)

   Return an :class:`IPv4Interface` or :class:`IPv6Interface` object depending
   on the IP address passed as argument.  *address* is a string or integer
   representing the IP address.  Either IPv4 or IPv6 addresses may be supplied;
   integers less than 2**32 will be considered to be IPv4 by default.  A
   :exc:`ValueError` is raised if *address* does not represent a valid IPv4 or
   IPv6 address.

One downside of these convenience functions is that the need to handle both
IPv4 and IPv6 formats means that error messages provide minimal
information on the precise error, as the functions don't know whether the
IPv4 or IPv6 format was intended. More detailed error reporting can be
obtained by calling the appropriate version specific class constructors
directly.


IP Addresses
------------

Address objects
^^^^^^^^^^^^^^^

The :class:`IPv4Address` and :class:`IPv6Address` objects share a lot of common
attributes.  Some attributes that are only meaningful for IPv6 addresses are
also implemented by :class:`IPv4Address` objects, in order to make it easier to
write code that handles both IP versions correctly.  Address objects are
:term:`hashable`, so they can be used as keys in dictionaries.

.. class:: IPv4Address(address)

   Construct an IPv4 address.  An :exc:`AddressValueError` is raised if
   *address* is not a valid IPv4 address.

   The following constitutes a valid IPv4 address:

   1. A string in decimal-dot notation, consisting of four decimal integers in
      the inclusive range 0--255, separated by dots (e.g. ``192.168.0.1``). Each
      integer represents an octet (byte) in the address. Leading zeroes are
      tolerated only for values less than 8 (as there is no ambiguity
      between the decimal and octal interpretations of such strings).
   2. An integer that fits into 32 bits.
   3. An integer packed into a :class:`bytes` object of length 4 (most
      significant octet first).

   >>> ipaddress.IPv4Address('192.168.0.1')
   IPv4Address('192.168.0.1')
   >>> ipaddress.IPv4Address(3232235521)
   IPv4Address('192.168.0.1')
   >>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
   IPv4Address('192.168.0.1')

   .. attribute:: version

      The appropriate version number: ``4`` for IPv4, ``6`` for IPv6.

   .. attribute:: max_prefixlen

      The total number of bits in the address representation for this
      version: ``32`` for IPv4, ``128`` for IPv6.

      The prefix defines the number of leading bits in an  address that
      are compared to determine whether or not an address is part of a
      network.

   .. attribute:: compressed
   .. attribute:: exploded

      The string representation in dotted decimal notation. Leading zeroes
      are never included in the representation.

      As IPv4 does not define a shorthand notation for addresses with octets
      set to zero, these two attributes are always the same as ``str(addr)``
      for IPv4 addresses. Exposing these attributes makes it easier to
      write display code that can handle both IPv4 and IPv6 addresses.

   .. attribute:: packed

      The binary representation of this address - a :class:`bytes` object of
      the appropriate length (most significant octet first). This is 4 bytes
      for IPv4 and 16 bytes for IPv6.

   .. attribute:: reverse_pointer

      The name of the reverse DNS PTR record for the IP address, e.g.::

          >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
          '1.0.0.127.in-addr.arpa'
          >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
          '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'

      This is the name that could be used for performing a PTR lookup, not the
      resolved hostname itself.

      .. versionadded:: 3.5

   .. attribute:: is_multicast

      ``True`` if the address is reserved for multicast use.  See
      :RFC:`3171` (for IPv4) or :RFC:`2373` (for IPv6).

   .. attribute:: is_private

      ``True`` if the address is allocated for private networks.  See
      iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
      (for IPv6).

   .. attribute:: is_global

      ``True`` if the address is allocated for public networks.  See
      iana-ipv4-special-registry_ (for IPv4) or iana-ipv6-special-registry_
      (for IPv6).

      .. versionadded:: 3.4

   .. attribute:: is_unspecified

      ``True`` if the address is unspecified.  See :RFC:`5735` (for IPv4)
      or :RFC:`2373` (for IPv6).

   .. attribute:: is_reserved

      ``True`` if the address is otherwise IETF reserved.

   .. attribute:: is_loopback

      ``True`` if this is a loopback address.  See :RFC:`3330` (for IPv4)
      or :RFC:`2373` (for IPv6).

   .. attribute:: is_link_local

      ``True`` if the address is reserved for link-local usage.  See
      :RFC:`3927`.

.. _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


.. class:: IPv6Address(address)

   Construct an IPv6 address.  An :exc:`AddressValueError` is raised if
   *address* is not a valid IPv6 address.

   The following constitutes a valid IPv6 address:

   1. A string consisting of eight groups of four hexadecimal digits, each
      group representing 16 bits.  The groups are separated by colons.
      This describes an *exploded* (longhand) notation.  The string can
      also be *compressed* (shorthand notation) by various means.  See
      :RFC:`4291` for details.  For example,
      ``"0000:0000:0000:0000:0000:0abc:0007:0def"`` can be compressed to
      ``"::abc:7:def"``.
   2. An integer that fits into 128 bits.
   3. An integer packed into a :class:`bytes` object of length 16, big-endian.

   >>> ipaddress.IPv6Address('2001:db8::1000')
   IPv6Address('2001:db8::1000')

   .. attribute:: compressed

   The short form of the address representation, with leading zeroes in
   groups omitted and the longest sequence of groups consisting entirely of
   zeroes collapsed to a single empty group.

   This is also the value returned by ``str(addr)`` for IPv6 addresses.

   .. attribute:: exploded

   The long form of the address representation, with all leading zeroes and
   groups consisting entirely of zeroes included.


   For the following attributes, see the corresponding documentation of the
   :class:`IPv4Address` class:

   .. attribute:: packed
   .. attribute:: reverse_pointer
   .. attribute:: version
   .. attribute:: max_prefixlen
   .. attribute:: is_multicast
   .. attribute:: is_private
   .. attribute:: is_global
   .. attribute:: is_unspecified
   .. attribute:: is_reserved
   .. attribute:: is_loopback
   .. attribute:: is_link_local

      .. versionadded:: 3.4
         is_global

   .. attribute:: is_site_local

      ``True`` if the address is reserved for site-local usage.  Note that
      the site-local address space has been deprecated by :RFC:`3879`. Use
      :attr:`~IPv4Address.is_private` to test if this address is in the
      space of unique local addresses as defined by :RFC:`4193`.

   .. attribute:: ipv4_mapped

      For addresses that appear to be IPv4 mapped addresses (starting with
      ``::FFFF/96``), this property will report the embedded IPv4 address.
      For any other address, this property will be ``None``.

   .. attribute:: sixtofour

      For addresses that appear to be 6to4 addresses  (starting with
      ``2002::/16``) as defined by :RFC:`3056`, this property will report
      the embedded IPv4 address.  For any other address, this property will
      be ``None``.

   .. attribute:: teredo

      For addresses that appear to be Teredo addresses (starting with
      ``2001::/32``) as defined by :RFC:`4380`, this property will report
      the embedded ``(server, client)`` IP address pair.  For any other
      address, this property will be ``None``.


Conversion to Strings and Integers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

To interoperate with networking interfaces such as the socket module,
addresses must be converted to strings or integers. This is handled using
the :func:`str` and :func:`int` builtin functions::

   >>> str(ipaddress.IPv4Address('192.168.0.1'))
   '192.168.0.1'
   >>> int(ipaddress.IPv4Address('192.168.0.1'))
   3232235521
   >>> str(ipaddress.IPv6Address('::1'))
   '::1'
   >>> int(ipaddress.IPv6Address('::1'))
   1


Operators
^^^^^^^^^

Address objects support some operators.  Unless stated otherwise, operators can
only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
IPv6).


Comparison operators
""""""""""""""""""""

Address objects can be compared with the usual set of comparison operators.  Some
examples::

   >>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
   True
   >>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
   False
   >>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
   True


Arithmetic operators
""""""""""""""""""""

Integers can be added to or subtracted from address objects.  Some examples::

   >>> IPv4Address('127.0.0.2') + 3
   IPv4Address('127.0.0.5')
   >>> IPv4Address('127.0.0.2') - 3
   IPv4Address('126.255.255.255')
   >>> IPv4Address('255.255.255.255') + 1
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address


IP Network definitions
----------------------

The :class:`IPv4Network` and :class:`IPv6Network` objects provide a mechanism
for defining and inspecting IP network definitions.  A network definition
consists of a *mask* and a *network address*, and as such defines a range of
IP addresses that equal the network address when masked (binary AND) with the
mask.  For example, a network definition with the mask ``255.255.255.0`` and
the network address ``192.168.1.0`` consists of IP addresses in the inclusive
range ``192.168.1.0`` to ``192.168.1.255``.


Prefix, net mask and host mask
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

There are several equivalent ways to specify IP network masks.  A *prefix*
``/<nbits>`` is a notation that denotes how many high-order bits are set in
the network mask.  A *net mask* is an IP address with some number of
high-order bits set.  Thus the prefix ``/24`` is equivalent to the net mask
``255.255.255.0`` in IPv4, or ``ffff:ff00::`` in IPv6.  In addition, a
*host mask* is the logical inverse of a *net mask*, and is sometimes used
(for example in Cisco access control lists) to denote a network mask.  The
host mask equivalent to ``/24`` in IPv4 is ``0.0.0.255``.


Network objects
^^^^^^^^^^^^^^^

All attributes implemented by address objects are implemented by network
objects as well.  In addition, network objects implement additional attributes.
All of these are common between :class:`IPv4Network` and :class:`IPv6Network`,
so to avoid duplication they are only documented for :class:`IPv4Network`.
Network objects are :term:`hashable`, so they can be used as keys in
dictionaries.

.. class:: IPv4Network(address, strict=True)

   Construct an IPv4 network definition.  *address* can be one of the following:

   1. A string consisting of an IP address and an optional mask, separated by
      a slash (``/``).  The IP address is the network address, and the mask
      can be either a single number, which means it's a *prefix*, or a string
      representation of an IPv4 address.  If it's the latter, the mask is
      interpreted as a *net mask* if it starts with a non-zero field, or as a
      *host mask* if it starts with a zero field, with the single exception of
      an all-zero mask which is treated as a *net mask*.  If no mask is provided,
      it's considered to be ``/32``.

      For example, the following *address* specifications are equivalent:
      ``192.168.1.0/24``, ``192.168.1.0/255.255.255.0`` and
      ``192.168.1.0/0.0.0.255``.

   2. An integer that fits into 32 bits.  This is equivalent to a
      single-address network, with the network address being *address* and
      the mask being ``/32``.

   3. An integer packed into a :class:`bytes` object of length 4, big-endian.
      The interpretation is similar to an integer *address*.

   4. A two-tuple of an address description and a netmask, where the address
      description is either a string, a 32-bits integer, a 4-bytes packed
      integer, or an existing IPv4Address object; and the netmask is either
      an integer representing the prefix length (e.g. ``24``) or a string
      representing the prefix mask (e.g. ``255.255.255.0``).

   An :exc:`AddressValueError` is raised if *address* is not a valid IPv4
   address.  A :exc:`NetmaskValueError` is raised if the mask is not valid for
   an IPv4 address.

   If *strict* is ``True`` and host bits are set in the supplied address,
   then :exc:`ValueError` is raised.  Otherwise, the host bits are masked out
   to determine the appropriate network address.

   Unless stated otherwise, all network methods accepting other network/address
   objects will raise :exc:`TypeError` if the argument's IP version is
   incompatible to ``self``.

   .. versionchanged:: 3.5

      Added the two-tuple form for the *address* constructor parameter.

   .. attribute:: version
   .. attribute:: max_prefixlen

      Refer to the corresponding attribute documentation in
      :class:`IPv4Address`.

   .. attribute:: is_multicast
   .. attribute:: is_private
   .. attribute:: is_unspecified
   .. attribute:: is_reserved
   .. attribute:: is_loopback
   .. attribute:: is_link_local

      These attributes are true for the network as a whole if they are true
      for both the network address and the broadcast address.

   .. attribute:: network_address

      The network address for the network. The network address and the
      prefix length together uniquely define a network.

   .. attribute:: broadcast_address

      The broadcast address for the network. Packets sent to the broadcast
      address should be received by every host on the network.

   .. attribute:: hostmask

      The host mask, as an :class:`IPv4Address` object.

   .. attribute:: netmask

      The net mask, as an :class:`IPv4Address` object.

   .. attribute:: with_prefixlen
   .. attribute:: compressed
   .. attribute:: exploded

      A string representation of the network, with the mask in prefix
      notation.

      ``with_prefixlen`` and ``compressed`` are always the same as
      ``str(network)``.
      ``exploded`` uses the exploded form the network address.

   .. attribute:: with_netmask

      A string representation of the network, with the mask in net mask
      notation.

   .. attribute:: with_hostmask

      A string representation of the network, with the mask in host mask
      notation.

   .. attribute:: num_addresses

      The total number of addresses in the network.

   .. attribute:: prefixlen

      Length of the network prefix, in bits.

   .. method:: hosts()

      Returns an iterator over the usable hosts in the network.  The usable
      hosts are all the IP addresses that belong to the network, except the
      network address itself and the network broadcast address.  For networks
      with a mask length of 31, the network address and network broadcast
      address are also included in the result.

         >>> list(ip_network('192.0.2.0/29').hosts())  #doctest: +NORMALIZE_WHITESPACE
         [IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),
          IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),
          IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]
         >>> list(ip_network('192.0.2.0/31').hosts())
         [IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]

   .. method:: overlaps(other)

      ``True`` if this network is partly or wholly contained in *other* or
      *other* is wholly contained in this network.

   .. method:: address_exclude(network)

      Computes the network definitions resulting from removing the given
      *network* from this one.  Returns an iterator of network objects.
      Raises :exc:`ValueError` if *network* is not completely contained in
      this network.

         >>> n1 = ip_network('192.0.2.0/28')
         >>> n2 = ip_network('192.0.2.1/32')
         >>> list(n1.address_exclude(n2))  #doctest: +NORMALIZE_WHITESPACE
         [IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
          IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]

   .. method:: subnets(prefixlen_diff=1, new_prefix=None)

      The subnets that join to make the current network definition, depending
      on the argument values.  *prefixlen_diff* is the amount our prefix
      length should be increased by.  *new_prefix* is the desired new
      prefix of the subnets; it must be larger than our prefix.  One and
      only one of *prefixlen_diff* and *new_prefix* must be set.  Returns an
      iterator of network objects.

         >>> list(ip_network('192.0.2.0/24').subnets())
         [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
         >>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))  #doctest: +NORMALIZE_WHITESPACE
         [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
          IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
         >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26))  #doctest: +NORMALIZE_WHITESPACE
         [IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
          IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
         >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
         Traceback (most recent call last):
           File "<stdin>", line 1, in <module>
             raise ValueError('new prefix must be longer')
         ValueError: new prefix must be longer
         >>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
         [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]

   .. method:: supernet(prefixlen_diff=1, new_prefix=None)

      The supernet containing this network definition, depending on the
      argument values.  *prefixlen_diff* is the amount our prefix length
      should be decreased by.  *new_prefix* is the desired new prefix of
      the supernet; it must be smaller than our prefix.  One and only one
      of *prefixlen_diff* and *new_prefix* must be set.  Returns a single
      network object.

         >>> ip_network('192.0.2.0/24').supernet()
         IPv4Network('192.0.2.0/23')
         >>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
         IPv4Network('192.0.0.0/22')
         >>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
         IPv4Network('192.0.0.0/20')

   .. method:: subnet_of(other)

      Returns *True* if this network is a subnet of *other*.

        >>> a = ip_network('192.168.1.0/24')
        >>> b = ip_network('192.168.1.128/30')
        >>> b.subnet_of(a)
        True

      .. versionadded:: 3.7

   .. method:: supernet_of(other)

      Returns *True* if this network is a supernet of *other*.

        >>> a = ip_network('192.168.1.0/24')
        >>> b = ip_network('192.168.1.128/30')
        >>> a.supernet_of(b)
        True

      .. versionadded:: 3.7

   .. method:: compare_networks(other)

      Compare this network to *other*.  In this comparison only the network
      addresses are considered; host bits aren't.  Returns either ``-1``,
      ``0`` or ``1``.

         >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
         -1
         >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
         1
         >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
         0

      .. deprecated:: 3.7
         It uses the same ordering and comparison algorithm as "<", "==", and ">"


.. class:: IPv6Network(address, strict=True)

   Construct an IPv6 network definition.  *address* can be one of the following:

   1. A string consisting of an IP address and an optional prefix length,
      separated by a slash (``/``).  The IP address is the network address,
      and the prefix length must be a single number, the *prefix*.  If no
      prefix length is provided, it's considered to be ``/128``.

      Note that currently expanded netmasks are not supported.  That means
      ``2001:db00::0/24`` is a valid argument while ``2001:db00::0/ffff:ff00::``
      not.

   2. An integer that fits into 128 bits.  This is equivalent to a
      single-address network, with the network address being *address* and
      the mask being ``/128``.

   3. An integer packed into a :class:`bytes` object of length 16, big-endian.
      The interpretation is similar to an integer *address*.

   4. A two-tuple of an address description and a netmask, where the address
      description is either a string, a 128-bits integer, a 16-bytes packed
      integer, or an existing IPv6Address object; and the netmask is an
      integer representing the prefix length.

   An :exc:`AddressValueError` is raised if *address* is not a valid IPv6
   address.  A :exc:`NetmaskValueError` is raised if the mask is not valid for
   an IPv6 address.

   If *strict* is ``True`` and host bits are set in the supplied address,
   then :exc:`ValueError` is raised.  Otherwise, the host bits are masked out
   to determine the appropriate network address.

   .. versionchanged:: 3.5

      Added the two-tuple form for the *address* constructor parameter.

   .. attribute:: version
   .. attribute:: max_prefixlen
   .. attribute:: is_multicast
   .. attribute:: is_private
   .. attribute:: is_unspecified
   .. attribute:: is_reserved
   .. attribute:: is_loopback
   .. attribute:: is_link_local
   .. attribute:: network_address
   .. attribute:: broadcast_address
   .. attribute:: hostmask
   .. attribute:: netmask
   .. attribute:: with_prefixlen
   .. attribute:: compressed
   .. attribute:: exploded
   .. attribute:: with_netmask
   .. attribute:: with_hostmask
   .. attribute:: num_addresses
   .. attribute:: prefixlen
   .. method:: hosts()

      Returns an iterator over the usable hosts in the network.  The usable
      hosts are all the IP addresses that belong to the network, except the
      Subnet-Router anycast address.  For networks with a mask length of 127,
      the Subnet-Router anycast address is also included in the result.

   .. method:: overlaps(other)
   .. method:: address_exclude(network)
   .. method:: subnets(prefixlen_diff=1, new_prefix=None)
   .. method:: supernet(prefixlen_diff=1, new_prefix=None)
   .. method:: subnet_of(other)
   .. method:: supernet_of(other)
   .. method:: compare_networks(other)

      Refer to the corresponding attribute documentation in
      :class:`IPv4Network`.

   .. attribute:: is_site_local

      These attribute is true for the network as a whole if it is true
      for both the network address and the broadcast address.


Operators
^^^^^^^^^

Network objects support some operators.  Unless stated otherwise, operators can
only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
IPv6).


Logical operators
"""""""""""""""""

Network objects can be compared with the usual set of logical operators.
Network objects are ordered first by network address, then by net mask.


Iteration
"""""""""

Network objects can be iterated to list all the addresses belonging to the
network.  For iteration, *all* hosts are returned, including unusable hosts
(for usable hosts, use the :meth:`~IPv4Network.hosts` method).  An
example::

   >>> for addr in IPv4Network('192.0.2.0/28'):
   ...     addr
   ...
   IPv4Address('192.0.2.0')
   IPv4Address('192.0.2.1')
   IPv4Address('192.0.2.2')
   IPv4Address('192.0.2.3')
   IPv4Address('192.0.2.4')
   IPv4Address('192.0.2.5')
   IPv4Address('192.0.2.6')
   IPv4Address('192.0.2.7')
   IPv4Address('192.0.2.8')
   IPv4Address('192.0.2.9')
   IPv4Address('192.0.2.10')
   IPv4Address('192.0.2.11')
   IPv4Address('192.0.2.12')
   IPv4Address('192.0.2.13')
   IPv4Address('192.0.2.14')
   IPv4Address('192.0.2.15')


Networks as containers of addresses
"""""""""""""""""""""""""""""""""""

Network objects can act as containers of addresses.  Some examples::

   >>> IPv4Network('192.0.2.0/28')[0]
   IPv4Address('192.0.2.0')
   >>> IPv4Network('192.0.2.0/28')[15]
   IPv4Address('192.0.2.15')
   >>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
   True
   >>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
   False


Interface objects
-----------------

Interface objects are :term:`hashable`, so they can be used as keys in
dictionaries.

.. class:: IPv4Interface(address)

   Construct an IPv4 interface.  The meaning of *address* is as in the
   constructor of :class:`IPv4Network`, except that arbitrary host addresses
   are always accepted.

   :class:`IPv4Interface` is a subclass of :class:`IPv4Address`, so it inherits
   all the attributes from that class.  In addition, the following attributes
   are available:

   .. attribute:: ip

      The address (:class:`IPv4Address`) without network information.

         >>> interface = IPv4Interface('192.0.2.5/24')
         >>> interface.ip
         IPv4Address('192.0.2.5')

   .. attribute:: network

      The network (:class:`IPv4Network`) this interface belongs to.

         >>> interface = IPv4Interface('192.0.2.5/24')
         >>> interface.network
         IPv4Network('192.0.2.0/24')

   .. attribute:: with_prefixlen

      A string representation of the interface with the mask in prefix notation.

         >>> interface = IPv4Interface('192.0.2.5/24')
         >>> interface.with_prefixlen
         '192.0.2.5/24'

   .. attribute:: with_netmask

      A string representation of the interface with the network as a net mask.

         >>> interface = IPv4Interface('192.0.2.5/24')
         >>> interface.with_netmask
         '192.0.2.5/255.255.255.0'

   .. attribute:: with_hostmask

      A string representation of the interface with the network as a host mask.

         >>> interface = IPv4Interface('192.0.2.5/24')
         >>> interface.with_hostmask
         '192.0.2.5/0.0.0.255'


.. class:: IPv6Interface(address)

   Construct an IPv6 interface.  The meaning of *address* is as in the
   constructor of :class:`IPv6Network`, except that arbitrary host addresses
   are always accepted.

   :class:`IPv6Interface` is a subclass of :class:`IPv6Address`, so it inherits
   all the attributes from that class.  In addition, the following attributes
   are available:

   .. attribute:: ip
   .. attribute:: network
   .. attribute:: with_prefixlen
   .. attribute:: with_netmask
   .. attribute:: with_hostmask

      Refer to the corresponding attribute documentation in
      :class:`IPv4Interface`.


Operators
^^^^^^^^^

Interface objects support some operators.  Unless stated otherwise, operators
can only be applied between compatible objects (i.e. IPv4 with IPv4, IPv6 with
IPv6).


Logical operators
"""""""""""""""""

Interface objects can be compared with the usual set of logical operators.

For equality comparison (``==`` and ``!=``), both the IP address and network
must be the same for the objects to be equal.  An interface will not compare
equal to any address or network object.

For ordering (``<``, ``>``, etc) the rules are different.  Interface and
address objects with the same IP version can be compared, and the address
objects will always sort before the interface objects.  Two interface objects
are first compared by their networks and, if those are the same, then by their
IP addresses.


Other Module Level Functions
----------------------------

The module also provides the following module level functions:

.. function:: v4_int_to_packed(address)

   Represent an address as 4 packed bytes in network (big-endian) order.
   *address* is an integer representation of an IPv4 IP address.  A
   :exc:`ValueError` is raised if the integer is negative or too large to be an
   IPv4 IP address.

   >>> ipaddress.ip_address(3221225985)
   IPv4Address('192.0.2.1')
   >>> ipaddress.v4_int_to_packed(3221225985)
   b'\xc0\x00\x02\x01'


.. function:: v6_int_to_packed(address)

   Represent an address as 16 packed bytes in network (big-endian) order.
   *address* is an integer representation of an IPv6 IP address.  A
   :exc:`ValueError` is raised if the integer is negative or too large to be an
   IPv6 IP address.


.. function:: summarize_address_range(first, last)

   Return an iterator of the summarized network range given the first and last
   IP addresses.  *first* is the first :class:`IPv4Address` or
   :class:`IPv6Address` in the range and *last* is the last :class:`IPv4Address`
   or :class:`IPv6Address` in the range.  A :exc:`TypeError` is raised if
   *first* or *last* are not IP addresses or are not of the same version.  A
   :exc:`ValueError` is raised if *last* is not greater than *first* or if
   *first* address version is not 4 or 6.

   >>> [ipaddr for ipaddr in ipaddress.summarize_address_range(
   ...    ipaddress.IPv4Address('192.0.2.0'),
   ...    ipaddress.IPv4Address('192.0.2.130'))]
   [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]


.. function:: collapse_addresses(addresses)

   Return an iterator of the collapsed :class:`IPv4Network` or
   :class:`IPv6Network` objects.  *addresses* is an iterator of
   :class:`IPv4Network` or :class:`IPv6Network` objects.  A :exc:`TypeError` is
   raised if *addresses* contains mixed version objects.

   >>> [ipaddr for ipaddr in
   ... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),
   ... ipaddress.IPv4Network('192.0.2.128/25')])]
   [IPv4Network('192.0.2.0/24')]


.. function:: get_mixed_type_key(obj)

   Return a key suitable for sorting between networks and addresses.  Address
   and Network objects are not sortable by default; they're fundamentally
   different, so the expression::

     IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')

   doesn't make sense.  There are some times however, where you may wish to
   have :mod:`ipaddress` sort these anyway.  If you need to do this, you can use
   this function as the *key* argument to :func:`sorted()`.

   *obj* is either a network or address object.


Custom Exceptions
-----------------

To support more specific error reporting from class constructors, the
module defines the following exceptions:

.. exception:: AddressValueError(ValueError)

   Any value error related to the address.


.. exception:: NetmaskValueError(ValueError)

   Any value error related to the net mask.
