ipaddress — Библиотека манипуляций IPv4/IPv6

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


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

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

Это полная справка по API модуля - для обзора и введения смотрите Знакомство с модулем ipaddress.

Добавлено в версии 3.3.

Удобные заводские функции

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

ipaddress.ip_address(address)

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

>>> 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. Если address не представляет собой действительный IPv4 или IPv6 адрес, или если в сети установлены биты хоста, возникает ошибка ValueError.

>>> 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. Если address не представляет собой действительный IPv4 или IPv6 адрес, будет выдано предупреждение ValueError.

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

IP-адреса

Объекты адресации

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

class ipaddress.IPv4Address(address)

Сконструировать IPv4-адрес. Если address не является действительным IPv4-адресом, выдается сообщение AddressValueError.

Ниже приведены правильные IPv4-адреса:

  1. Строка в десятичной точечной нотации, состоящая из четырех десятичных целых чисел в инклюзивном диапазоне 0–255, разделенных точками (например, 192.168.0.1). Каждое целое число представляет собой октет (байт) в адресе. Ведущие нули не допускаются, чтобы избежать путаницы с восьмеричной системой счисления.

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

Изменено в версии 3.8: Ведущие нули допускаются, даже в неоднозначных случаях, которые выглядят как восьмеричная нотация.

Изменено в версии 3.10: Ведущие нули больше не допускаются и рассматриваются как ошибка. Строки адресов IPv4 теперь разбираются так же строго, как glibc inet_pton().

Изменено в версии 3.9.5: Вышеуказанное изменение также было включено в Python 3.9, начиная с версии 3.9.5.

Изменено в версии 3.8.12: Вышеуказанное изменение также было включено в Python 3.8, начиная с версии 3.8.12.

version

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

max_prefixlen

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

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

compressed
exploded

Представление строки в точечной десятичной системе счисления. Ведущие нули никогда не включаются в представление.

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

packed

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

reverse_pointer

Имя PTR-записи обратной DNS для IP-адреса, например:

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

Это имя, которое может быть использовано для выполнения поиска PTR, а не само разрешенное имя хоста.

Добавлено в версии 3.5.

is_multicast

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

is_private

True если адрес выделен для частных сетей. См. iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6).

is_global

True если адрес выделен для сетей общего пользования. См. iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6).

Добавлено в версии 3.4.

is_unspecified

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

is_reserved

True если адрес иначе зарезервирован IETF.

is_loopback

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

True, если адрес зарезервирован для использования в локальной сети. См. RFC 3927.

IPv4Address.__format__(fmt)

Возвращает строковое представление IP-адреса, управляемое явной строкой формата. fmt может быть одним из следующих значений: 's', опция по умолчанию, эквивалентная str(), 'b' для двоичной строки с нулевым заполнением, 'X' или 'x' для шестнадцатеричного представления в верхнем или нижнем регистре, или 'n', что эквивалентно 'b' для адресов IPv4 и 'x' для IPv6. Для двоичного и шестнадцатеричного представлений доступны спецификатор формы '#' и опция группировки '_'. __format__ используется format, str.format и f-строками.

>>> format(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1'))
'0b11000000101010000000000000000001'
>>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}'
'2001:db8::1000'
>>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X')
'2001_0DB8_0000_0000_0000_0000_0000_1000'
>>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000'))
'0x2001_0db8_0000_0000_0000_0000_0000_1000'

Добавлено в версии 3.9.

class ipaddress.IPv6Address(address)

Сконструировать IPv6-адрес. Если address не является действительным IPv6-адресом, выдается сообщение AddressValueError.

Следующее является действительным адресом IPv6:

  1. Строка, состоящая из восьми групп по четыре шестнадцатеричных цифры, каждая из которых представляет 16 бит. Группы разделены двоеточиями. Это описывает развернутую (длинную) нотацию. Строка также может быть сжата (сокращенная нотация) различными способами. Подробности см. в разделе RFC 4291. Например, "0000:0000:0000:0000:0000:0abc:0007:0def" может быть сжата до "::abc:7:def".

    По желанию, строка может также иметь идентификатор зоны действия, выраженный суффиксом %scope_id. Если он присутствует, идентификатор зоны действия должен быть непустым и не может содержать %. Подробности см. в разделе RFC 4007. Например, fe80::1234%1 может идентифицировать адрес fe80::1234 на первом канале узла.

  2. Целое число, умещающееся в 128 бит.

  3. Целое число, упакованное в объект bytes длиной 16, big-endian.

>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('ff02::5678%1')
IPv6Address('ff02::5678%1')
compressed

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

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

exploded

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

Для следующих атрибутов и методов смотрите соответствующую документацию класса IPv4Address:

packed
reverse_pointer
version
max_prefixlen
is_multicast
is_private
is_global
is_unspecified
is_reserved
is_loopback

Добавлено в версии 3.4: является_глобальным

is_site_local

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

ipv4_mapped

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

scope_id

Для скопированных адресов, как определено в RFC 4007, это свойство идентифицирует конкретную зону области видимости адреса, к которой принадлежит адрес, в виде строки. Если зона области видимости не указана, это свойство будет None.

sixtofour

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

teredo

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

IPv6Address.__format__(fmt)

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

Добавлено в версии 3.9.

Преобразование в строки и целые числа

Для взаимодействия с сетевыми интерфейсами, такими как модуль сокетов, адреса должны быть преобразованы в строки или целые числа. Для этого используются встроенные функции 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

Обратите внимание, что скопированные адреса IPv6 преобразуются в целые числа без ID зоны охвата.

Операторы

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

Операторы сравнения

Адресные объекты можно сравнивать с помощью обычного набора операторов сравнения. Одинаковые IPv6-адреса с разными идентификаторами зоны видимости не равны. Некоторые примеры:

>>> 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
>>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1')
False
>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')
True

Арифметические операторы

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

>>> 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-сети

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

Префикс, маска сети и маска хоста

Существует несколько эквивалентных способов задания сетевых масок IP. Префикс * /<nbits> - это обозначение, которое указывает, сколько старших битов установлено в сетевой маске. Сетевая маска* - это IP-адрес с некоторым количеством установленных старших битов. Таким образом, префикс /24 эквивалентен сетевой маске 255.255.255.0 в IPv4 или ffff:ff00:: в IPv6. Кроме того, маска хоста является логической инверсией маски сети и иногда используется (например, в списках контроля доступа Cisco) для обозначения маски сети. Маска хоста, эквивалентная /24 в IPv4, - это 0.0.0.255.

Сетевые объекты

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

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 бита. Это эквивалентно одноадресной сети, где адрес сети - адрес, а маска - /32.

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

  4. Двойной кортеж из описания адреса и маски сети, где описание адреса - это либо строка, либо 32-битное целое число, либо 4-байтовое упакованное целое число, либо существующий объект IPv4Address; а маска сети - это либо целое число, представляющее длину префикса (например, 24), либо строка, представляющая маску префикса (например, 255.255.255.0).

Возникает ошибка AddressValueError, если адрес не является действительным адресом IPv4. Возникает ошибка NetmaskValueError, если маска не является действительной для IPv4-адреса.

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

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

Изменено в версии 3.5: Добавлена форма с двумя кортежами для параметра конструктора address.

version
max_prefixlen

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

is_multicast
is_private
is_unspecified
is_reserved
is_loopback

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

network_address

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

broadcast_address

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

hostmask

Маска хоста, как объект IPv4Address.

netmask

Маска сети, как объект IPv4Address.

with_prefixlen
compressed
exploded

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

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

with_netmask

Строковое представление сети с указанием маски в нотации net mask.

with_hostmask

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

num_addresses

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

prefixlen

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

hosts()

Возвращает итератор по используемым хостам в сети. Полезными хостами являются все IP-адреса, принадлежащие сети, за исключением самого сетевого адреса и широковещательного адреса сети. Для сетей с длиной маски 31 сетевой адрес и широковещательный адрес сети также включаются в результат. Сети с маской 32 возвращают список, содержащий единственный адрес хоста.

>>> 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')]
>>> list(ip_network('192.0.2.0/31').hosts())
[IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]
>>> list(ip_network('192.0.2.1/32').hosts())
[IPv4Address('192.0.2.1')]
overlaps(other)

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

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

Возвращает True, если эта сеть является подсетью другой.

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

Добавлено в версии 3.7.

supernet_of(other)

Возвращает True, если эта сеть является суперсетью другой.

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

Добавлено в версии 3.7.

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

Не рекомендуется, начиная с версии 3.7: Он использует тот же алгоритм упорядочивания и сравнения, что и «<», «==» и «>».

class ipaddress.IPv6Network(address, strict=True)

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

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

    Обратите внимание, что в настоящее время расширенные нетмаски не поддерживаются. Это означает, что 2001:db00::0/24 является допустимым аргументом, а 2001:db00::0/ffff:ff00:: - нет.

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

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

  4. Двойной кортеж из описания адреса и маски сети, где описание адреса - это либо строка, либо 128-битное целое число, либо 16-битное упакованное целое число, либо существующий объект IPv6Address; а маска сети - это целое число, представляющее длину префикса.

Возникает ошибка AddressValueError, если адрес не является действительным адресом IPv6. Возникает ошибка NetmaskValueError, если маска не является действительной для IPv6-адреса.

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

Изменено в версии 3.5: Добавлена форма с двумя кортежами для параметра конструктора address.

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

Возвращает итератор по используемым хостам в сети. Полезными хостами являются все IP-адреса, принадлежащие сети, за исключением адресов Subnet-Router anycast. Для сетей с длиной маски 127, адрес Subnet-Router anycast также включается в результат. Сети с маской 128 возвращают список, содержащий единственный адрес хоста.

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

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

is_site_local

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

Операторы

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

Логические операторы

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

Итерация

Объекты сети можно итерировать для получения списка всех адресов, принадлежащих сети. При итерации возвращаются все хосты, включая непригодные (для пригодных хостов используйте метод 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')

Сети как контейнеры адресов

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

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

Объекты интерфейса

Объекты интерфейса являются hashable, поэтому их можно использовать в качестве ключей в словарях.

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.

Операторы

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

Логические операторы

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

При сравнении на равенство (== и !=) для равенства объектов IP-адрес и сеть должны быть одинаковыми. Интерфейс не будет сравниваться с любым объектом адреса или сети.

Для упорядочивания (<, > и т.д.) правила другие. Объекты интерфейса и адреса с одинаковой версией IP можно сравнивать, при этом объекты адреса всегда будут сортироваться перед объектами интерфейса. Два объекта интерфейса сначала сравниваются по их сетям и, если они одинаковы, то по их IP-адресам.

Другие функции уровня модуля

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

ipaddress.v4_int_to_packed(address)

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

>>> 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 - это целочисленное представление IP-адреса IPv6. Если целое число отрицательное или слишком большое, чтобы быть IPv6 IP-адресом, выдается сообщение ValueError.

ipaddress.summarize_address_range(first, last)

Возвращает итератор суммарного диапазона сетей, заданного первым и последним IP-адресами. first - это первый IPv4Address или IPv6Address в диапазоне, а last - последний IPv4Address или IPv6Address в диапазоне. Возникает ошибка TypeError, если first или last не являются IP-адресами или имеют разную версию. Возникает ошибка ValueError, если последний не больше первого или если версия первого адреса не 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. Если addresses содержит объекты смешанных версий, возникает ошибка TypeError.

>>> [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 сортировал их в любом случае. Если вам нужно это сделать, вы можете использовать эту функцию в качестве ключевого аргумента для sorted().

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

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

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

exception ipaddress.AddressValueError(ValueError)

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

exception ipaddress.NetmaskValueError(ValueError)

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

Вернуться на верх