Документация Python неофициальный перевод
Содержание страницы

21.28. ipaddress – библиотека для работы с IPv4/IPv6ipaddress – IPv4/IPv6 manipulation library

Исходный код: Lib/ipaddress.py


Примечание

Модуль ipaddress был включён в стандартную библиотеку на временной основе. Разработчики могут вносить изменения, несовместимые с предыдущими версиями (вплоть до удаления пакета), если сочтут это необходимым.

ipaddress предоставляет возможности для создания, изменения и работы с адресами и сетями IPv4 и IPv6.

Функции и классы этого модуля упрощают выполнение различных задач, связанных с IP-адресами: проверку, находятся ли два хоста в одной подсети; перебор всех хостов в заданной подсети; проверку, является ли строка корректным IP-адресом или определением сети, и так далее.

Это полный справочник по API модуля – обзор и введение см. в разделе An introduction to the ipaddress module.

Новое в версии 3.3.

21.28.1. Удобные фабричные функцииConvenience factory functions

Модуль ipaddress предоставляет фабричные функции для удобного создания IP-адресов, сетей и интерфейсов:

ipaddress.ip_address(address)

Возвращает объект IPv4Address или IPv6Address в зависимости от IP-адреса, переданного в качестве аргумента. Можно передавать как IPv4, так и IPv6 адреса; целые числа меньше 2**32 по умолчанию считаются IPv4. Исключение ValueError выбрасывается, если address не представляет допустимый IPv4 или IPv6 адрес.

>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:db8::')
IPv6Address('2001:db8::')
ipaddress.ip_network(address, strict=True)

Возвращает объект IPv4Network или IPv6Network в зависимости от IP-адреса, переданного в качестве аргумента. address – это строка или целое число, представляющее IP-сеть. Можно передавать как IPv4, так и IPv6 сети; целые числа меньше 2**32 по умолчанию считаются IPv4. strict передаётся в конструктор IPv4Network или IPv6Network. Исключение ValueError выбрасывается, если address не представляет допустимый IPv4 или IPv6 адрес, или если в сети установлены биты хоста.

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

Возвращает объект IPv4Interface или IPv6Interface в зависимости от IP-адреса, переданного в качестве аргумента. address – это строка или целое число, представляющее IP-адрес. Можно передавать как IPv4, так и IPv6 адреса; целые числа меньше 2**32 по умолчанию считаются IPv4. Исключение ValueError выбрасывается, если address не представляет допустимый IPv4 или IPv6 адрес.

Недостаток этих удобных функций в том, что необходимость поддержки обоих форматов – IPv4 и IPv6 – приводит к тому, что сообщения об ошибках содержат минимум информации о точной ошибке, поскольку функции не знают, какой формат предполагался. Более подробные сообщения об ошибках можно получить, напрямую вызывая соответствующие версии конструкторов классов.

21.28.2. IP-адресаIP Addresses

21.28.2.1. Объекты адресовAddress objects

Объекты IPv4Address и IPv6Address имеют много общих атрибутов. Некоторые атрибуты, имеющие смысл только для IPv6-адресов, также реализованы в объектах IPv4Address, чтобы упростить написание кода, корректно работающего с обеими версиями IP.

class ipaddress.IPv4Address(address)

Создаёт IPv4-адрес. Исключение AddressValueError выбрасывается, если address не является допустимым IPv4-адресом.

Корректным IPv4-адресом считается следующее:

  1. Строка в десятично-точечной нотации, состоящая из четырёх десятичных целых чисел в диапазоне от 0 до 255 включительно, разделённых точками (например, 192.168.0.1). Каждое целое число представляет октет (байт) адреса. Начальные нули допускаются только для значений меньше 8 (поскольку в таких строках нет неоднозначности между десятичной и восьмеричной интерпретацией).
  2. Целое число, помещающееся в 32 бита.
  3. Целое число, упакованное в объект bytes длиной 4 (старший октет первым).
>>> 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')
version

Соответствующий номер версии: 4 для IPv4, 6 для IPv6.

max_prefixlen

Общее количество бит в представлении адреса для данной версии: 32 для IPv4, 128 для IPv6.

Префикс определяет количество старших бит в адресе, которые сравниваются, чтобы определить, принадлежит ли адрес сети.

compressed
exploded

Строковое представление в десятичной записи с точками. Начальные нули никогда не включаются в представление.

Поскольку IPv4 не определяет сокращённой записи для адресов с нулевыми октетами, эти два атрибута всегда совпадают с str(addr) для IPv4-адресов. Наличие этих атрибутов упрощает написание кода отображения, который может работать как с IPv4, так и с IPv6-адресами.

packed

Двоичное представление этого адреса – объект bytes соответствующей длины (старший октет первым). Для IPv4 это 4 байта, для IPv6 – 16 байт.

is_multicast

True, если адрес зарезервирован для многоадресной рассылки. См. RFC 3171 (для IPv4) или RFC 2373 (для IPv6).

is_private

True, если адрес выделен для частных сетей. См. RFC 1918 (для IPv4) или RFC 4193 (для IPv6).

is_unspecified

True, если адрес неопределён. См. RFC 5735 (для IPv4) или RFC 2373 (для IPv6).

is_reserved

True, если адрес иным образом зарезервирован IETF.

is_loopback

True, если это адрес loopback. См. RFC 3330 (для IPv4) или RFC 2373 (для IPv6).

True, если адрес зарезервирован для использования в link-local. См. RFC 3927.

class ipaddress.IPv6Address(address)

Создаёт IPv6-адрес. Если address не является допустимым IPv6-адресом, возникает исключение AddressValueError.

Допустимый IPv6-адрес образуется следующим образом:

  1. Строка, состоящая из восьми групп по четыре шестнадцатеричные цифры, каждая group представляет 16 бит. Группы разделяются двоеточиями. Это описывает развёрнутую (полную) нотацию. Строка может также быть сжатой (краткой нотацией) различными способами. См. RFC 4291 для подробностей. Например, "0000:0000:0000:0000:0000:0abc:0007:0def" может быть сжата до "::abc:7:def".
  2. Целое число, помещающееся в 128 бит.
  3. Целое число, упакованное в объект bytes длиной 16 байт, с прямым порядком байт (big-endian).
>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
compressed

Краткая форма представления адреса, в которой опущены ведущие нули в группах, а самая длинная последовательность групп, состоящих полностью из нулей, сжата в одну пустую группу.

Это также значение, возвращаемое str(addr) для IPv6-адресов.

exploded

Полная форма представления адреса, включающая все ведущие нули и группы, состоящие полностью из нулей.

packed
version
max_prefixlen
is_multicast
is_private
is_unspecified
is_reserved
is_loopback

Обратитесь к соответствующей документации атрибута в IPv4Address.

is_site_local

True, если адрес зарезервирован для использования в site-local. Обратите внимание, что пространство site-local адресов было объявлено устаревшим в RFC 3879. Используйте is_private для проверки, находится ли этот адрес в пространстве уникальных локальных адресов, как определено в RFC 4193.

ipv4_mapped

Для адресов, которые выглядят как IPv4-mapped адреса (начинаются с ::FFFF/96), это свойство возвращает встроенный IPv4-адрес. Для любого другого адреса это свойство будет None.

sixtofour

Для адресов, которые выглядят как 6to4 адреса (начинаются с 2002::/16) в соответствии с RFC 3056, это свойство возвращает встроенный IPv4-адрес. Для любого другого адреса это свойство будет None.

teredo

Для адресов, которые выглядят как Teredo адреса (начинаются с 2001::/32) в соответствии с RFC 4380, это свойство возвращает встроенную пару IP-адресов (server, client). Для любого другого адреса это свойство будет None.

21.28.2.2. Преобразование в строки и целые числаConversion to Strings and Integers

Для взаимодействия с сетевыми интерфейсами, такими как модуль socket, адреса должны быть преобразованы в строки или целые числа. Это делается с помощью встроенных функций str() и int():

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

21.28.2.3. ОператорыOperators

Объекты адресов поддерживают некоторые операторы. Если не указано иное, операторы могут применяться только между совместимыми объектами (т.е. IPv4 с IPv4, IPv6 с IPv6).

21.28.2.3.1. Операторы сравненияComparison operators

Объекты адресов можно сравнивать с помощью обычных операторов сравнения. Несколько примеров:

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

21.28.2.3.2. Арифметические операторыArithmetic operators

Целые числа можно прибавлять к объектам адресов или вычитать из них. Несколько примеров:

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

21.28.3. Определения IP-сетейIP Network definitions

Объекты IPv4Network и IPv6Network предоставляют механизм для определения и проверки определений IP-сетей. Определение сети состоит из маски и сетевого адреса и, таким образом, задаёт диапазон IP-адресов, которые равны сетевому адресу при наложении маски (побитовое И) с маской. Например, определение сети с маской 255.255.255.0 и сетевым адресом 192.168.1.0 состоит из IP-адресов в диапазоне от 192.168.1.0 до 192.168.1.255 включительно.

21.28.3.1. Префикс, маска сети и маска хоста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.

21.28.3.2. Объекты сетейNetwork objects

Все атрибуты, реализованные объектами адресов, также реализованы и объектами сетей. Кроме того, объекты сетей реализуют дополнительные атрибуты. Все они общие для IPv4Network и IPv6Network, поэтому для избежания дублирования они документированы только для IPv4Network.

class ipaddress.IPv4Network(address, strict=True)

Создаёт определение IPv4-сети. адрес может быть одним из следующих:

  1. Строка, содержащая IP-адрес и необязательную маску, разделённые косой чертой (/). IP-адрес является сетевым адресом, а маска может быть либо числом, которое означает префикс, либо строковым представлением IPv4-адреса. Во втором случае маска интерпретируется как маска сети, если она начинается с ненулевого поля, или как маска хоста, если начинается с нулевого поля. Если маска не указана, считается, что она равна /32.

    Например, следующие спецификации адрес эквивалентны: 192.168.1.0/24, 192.168.1.0/255.255.255.0 и 192.168.1.0/0.0.0.255.

  2. Целое число, помещающееся в 32 бита. Оно эквивалентно сети с одним адресом, где адресом сети является address, а маской – /32.

  3. Целое число, упакованное в объект bytes длиной 4, big-endian. Интерпретация аналогична целочисленному адресу.

AddressValueError возникает, если address не является допустимым IPv4-адресом. NetmaskValueError возникает, если маска недопустима для IPv4-адреса.

Если strict равно True и в указанном адресе установлены биты хоста, то вызывается исключение ValueError. В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.

Если не указано иное, все методы сетей, принимающие другие объекты сетей/адресов, вызывают TypeError, если версия IP аргумента несовместима с self.

version
max_prefixlen

Обратитесь к соответствующей документации атрибута в IPv4Address.

is_multicast
is_private
is_unspecified
is_reserved
is_loopback

Эти атрибуты истинны для сети в целом, если они истинны как для сетевого адреса, так и для широковещательного адреса

network_address

Сетевой адрес для этой сети. Сетевой адрес и длина префикса вместе однозначно определяют сеть.

broadcast_address

Широковещательный адрес для этой сети. Пакеты, отправленные на широковещательный адрес, должны быть получены каждым хостом в сети.

hostmask

Маска хоста в виде строки.

with_prefixlen
compressed
exploded

Строковое представление сети с маской в префиксной нотации.

with_prefixlen и compressed всегда совпадают с str(network). exploded использует развернутую форму сетевого адреса.

with_netmask

Строковое представление сети с маской в нотации маски сети.

with_hostmask

Строковое представление сети с маской в нотации хостовой маски.

num_addresses

Общее количество адресов в сети.

prefixlen

Длина префикса сети в битах.

hosts()

Возвращает итератор по доступным хостам в сети. Доступные хосты – это все IP-адреса, принадлежащие сети, за исключением самого сетевого адреса и широковещательного адреса сети.

>>> list(ip_network('192.0.2.0/29').hosts())  
[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')]
overlaps(other)

True, если данная сеть частично или полностью содержится в other или other полностью содержится в данной сети.

address_exclude(network)

Вычисляет определения сетей, получающиеся в результате удаления заданной сети из данной. Возвращает итератор объектов сетей. Вызывает ValueError, если сеть не полностью содержится в данной сети.

>>> n1 = ip_network('192.0.2.0/28')
>>> n2 = ip_network('192.0.2.1/32')
>>> list(n1.address_exclude(n2))  
[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
 IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
subnets(prefixlen_diff=1, new_prefix=None)

Подсети, объединение которых образует текущее определение сети, в зависимости от значений аргументов. prefixlen_diff – это величина, на которую должна быть увеличена длина нашего префикса. new_prefix – это желаемый новый префикс подсетей; он должен быть больше нашего префикса. Должен быть задан ровно один из prefixlen_diff и new_prefix. Возвращает итератор объектов сети.

>>> 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))  
[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))  
[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')]
supernet(prefixlen_diff=1, new_prefix=None)

Суперсеть, содержащая данное определение сети, в зависимости от значений аргументов. prefixlen_diff – это величина, на которую должна быть уменьшена длина нашего префикса. new_prefix – это желаемый новый префикс суперсети; он должен быть меньше нашего префикса. Должен быть задан ровно один из prefixlen_diff и new_prefix. Возвращает один объект сети.

>>> 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')
compare_networks(other)

Сравнивает данную сеть с другим. При таком сравнении учитываются только сетевые адреса; биты хоста не учитываются. Возвращает -1, 0 или 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
class ipaddress.IPv6Network(address, strict=True)

Создаёт определение IPv6-сети. адрес может быть одним из следующих:

  1. Строка, содержащая IP-адрес и необязательную маску, разделённые косой чертой (/). IP-адрес является сетевым адресом, а маска может быть либо числом, которое означает префикс, либо строковым представлением IPv6-адреса. Во втором случае маска интерпретируется как маска сети. Если маска не указана, считается, что она равна /128.

    Например, следующие спецификации адреса эквивалентны: 2001:db00::0/24 и 2001:db00::0/ffff:ff00::.

  2. Целое число, помещающееся в 128 бит. Это эквивалентно сети с одним адресом, где сетевым адресом является адрес, а маской – /128.

  3. Целое число, упакованное в объект bytes длиной 16 байт, big-endian. Интерпретация аналогична целому числу address.

Исключение AddressValueError возникает, если адрес не является допустимым IPv6 адресом. Исключение NetmaskValueError возникает, если маска недопустима для адреса IPv6.

Если strict равно True и в указанном адресе установлены биты хоста, то вызывается исключение ValueError. В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.

version
max_prefixlen
is_multicast
is_private
is_unspecified
is_reserved
is_loopback
network_address
broadcast_address
hostmask
with_prefixlen
compressed
exploded
with_netmask
with_hostmask
num_addresses
prefixlen
hosts()
overlaps(other)
address_exclude(network)
subnets(prefixlen_diff=1, new_prefix=None)
supernet(prefixlen_diff=1, new_prefix=None)
compare_networks(other)

Смотрите документацию соответствующего атрибута в IPv4Network

is_site_local

Этот атрибут истинен для всей сети, если он истинен как для сетевого адреса, так и для широковещательного адреса.

21.28.3.3. ОператорыOperators

Сетевые объекты поддерживают некоторые операторы. Если не указано иное, операторы можно применять только между совместимыми объектами (например, IPv4 с IPv4, IPv6 с IPv6).

21.28.3.3.1. Логические операторыLogical operators

Сетевые объекты можно сравнивать с помощью стандартного набора логических операторов, аналогично адресным объектам.

21.28.3.3.2. ИтерацияIteration

Объекты сети можно перебирать, чтобы получить список всех адресов, принадлежащих сети. При переборе возвращаются все хосты, включая неиспользуемые (для получения используемых хостов используйте метод hosts()). Пример:

>>> 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')

21.28.3.3.3. Сети как контейнеры адресовNetworks as containers of addresses

Сетевые объекты могут выступать в качестве контейнеров адресов. Несколько примеров:

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

21.28.4. Объекты интерфейсаInterface objects

class ipaddress.IPv4Interface(address)

Создаёт интерфейс IPv4. Значение address такое же, как в конструкторе IPv4Network, за исключением того, что произвольные адреса хостов всегда принимаются.

IPv4Interface является подклассом IPv4Address, поэтому наследует все атрибуты этого класса. Кроме того, доступны следующие атрибуты:

ip

Адрес (IPv4Address) без информации о сети.

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

Сеть (IPv4Network), к которой принадлежит этот интерфейс.

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

Строковое представление интерфейса с маской в префиксной нотации.

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

Строковое представление интерфейса, где сеть указана в виде маски сети.

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

Строковое представление интерфейса, где сеть указана в виде маски хоста.

>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_hostmask
'192.0.2.5/0.0.0.255'
class ipaddress.IPv6Interface(address)

Создаёт интерфейс IPv6. Значение address такое же, как в конструкторе IPv6Network, за исключением того, что произвольные адреса хостов всегда принимаются.

IPv6Interface является подклассом IPv6Address, поэтому наследует все атрибуты этого класса. Кроме того, доступны следующие атрибуты:

ip
network
with_prefixlen
with_netmask
with_hostmask

Смотрите документацию соответствующего атрибута в IPv4Interface.

21.28.5. Другие функции уровня модуляOther Module Level Functions

Модуль также предоставляет следующие функции уровня модуля:

ipaddress.v4_int_to_packed(address)

Представляет адрес в виде 4 упакованных байтов в сетевом порядке (big-endian). address – это целочисленное представление IPv4-адреса. Исключение ValueError возбуждается, если целое число отрицательное или слишком велико для IPv4-адреса.

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

Представляет адрес в виде 16 упакованных байтов в сетевом порядке (big-endian). address – это целочисленное представление IPv6-адреса. Исключение ValueError возбуждается, если целое число отрицательное или слишком велико для IPv6-адреса.

ipaddress.summarize_address_range(first, last)

Возвращает итератор свёрнутого диапазона сетей по первому и последнему IP-адресам. first – первый адрес IPv4Address или IPv6Address в диапазоне, а last – последний адрес IPv4Address или IPv6Address в диапазоне. Исключение TypeError возбуждается, если first или last не являются IP-адресами или имеют разные версии. Исключение ValueError возбуждается, если last не больше first или если версия адреса first не равна 4 или 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')]
ipaddress.collapse_addresses(addresses)

Возвращает итератор свёрнутых объектов IPv4Network или IPv6Network. addresses – это итератор объектов IPv4Network или IPv6Network. Исключение TypeError возбуждается, если addresses содержит объекты разных версий.

>>> [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')]
ipaddress.get_mixed_type_key(obj)

Возвращает ключ, подходящий для сортировки сетей и адресов. Объекты Address и Network по умолчанию не сортируются; они принципиально разные, поэтому выражение:

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

не имеет смысла. Однако в некоторых случаях может потребоваться, чтобы ipaddress всё равно сортировал их. Если это необходимо, можно использовать эту функцию в качестве аргумента key для sorted().

obj – это объект сети или адреса.

21.28.6. Пользовательские исключенияCustom Exceptions

Для поддержки более конкретных сообщений об ошибках от конструкторов классов модуль определяет следующие исключения:

exception ipaddress.AddressValueError(ValueError)

Любая ошибка значения, связанная с адресом.

exception ipaddress.NetmaskValueError(ValueError)

Любая ошибка значения, связанная с маской подсети.