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

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


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

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

Это полный справочник по API модуля — обзор и введение см. в разделе Введение в модуль ip-адресов.

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

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

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

IP-адреса

Адресные объекты

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

class ipaddress.IPv4Address(address)

Создайте IPv4-адрес. Значение AddressValueError задается, если address не является допустимым IPv4-адресом.

Действительным 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.9.5: Начальные нули больше не допускаются и рассматриваются как ошибка. Строки IPv4-адресов теперь обрабатываются так же строго, как и glibc inet_pton().

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

Имя обратной записи DNS PTR для 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_private - это False для общего адресного пространства (100.64.0.0/10)

  • Для IPv6-адресов, сопоставленных с IPv4, значение is_private определяется семантикой базовых IPv4-адресов и выполняется следующее условие (см. IPv6Address.ipv4_mapped).:

    address.is_private == address.ipv4_mapped.is_private
    

is_private имеет значение, противоположное is_global, за исключением общего адресного пространства (диапазон 100.64.0.0/10), где они оба равны False.

Изменено в версии 3.11.10: Исправлены некоторые ложноположительные и ложноотрицательные срабатывания.

  • 192.0.0.0/24 считается закрытым, за исключением 192.0.0.9/32 и 192.0.0.10/32 (ранее закрытым считался только поддиапазон 192.0.0.0/29).

  • 64:ff9b:1::/48 считается закрытым.

  • 2002::/16 считается закрытым.

  • В пределах 2001::/23 есть исключения (в противном случае они считаются частными): 2001:1::1/128, 2001:1::2/128, 2001:3::/32, 2001:4:112::/48, 2001:20::/28, 2001:30::/28. Исключения не считаются частными.

is_global

True если адрес определен как глобально доступный с помощью iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6), за следующим исключением:

Для IPv6-адресов, сопоставленных с IPv4, значение is_private определяется семантикой базовых IPv4-адресов и выполняется следующее условие (см. IPv6Address.ipv4_mapped).:

address.is_global == address.ipv4_mapped.is_global

is_global имеет значение, противоположное is_private, за исключением общего адресного пространства (диапазон 100.64.0.0/10), где они оба равны False.

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

Изменено в версии 3.11.10: Исправлены некоторые ложноположительные и ложноотрицательные срабатывания, подробности смотрите в разделе is_private.

is_unspecified

True если адрес не указан. Смотрите RFC 5735 (для IPv4) или RFC 2373 (для IPv6).

is_reserved

True если адрес в противном случае зарезервирован по стандарту IETF.

is_loopback

True если это адрес обратной связи. Смотрите 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-адрес. Значение AddressValueError задается, если address не является допустимым IPv6-адресом.

Действительным 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, в порядке возрастания.

>>> 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_global - глобальный

is_site_local

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

ipv4_mapped

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

scope_id

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

sixtofour

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

teredo

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

IPv6Address.__format__(fmt)

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

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

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

Для взаимодействия с сетевыми интерфейсами, такими как модуль 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

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

Операторы

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

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

Объекты адресов можно сравнивать с помощью обычного набора операторов сравнения. Одни и те же 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.

    Например, следующие спецификации address эквивалентны: 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, в порядке возрастания. Интерпретация аналогична целочисленному адресу.

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

Значение AddressValueError указывается, если address не является допустимым 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

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

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, если эта сеть является подсетью other.

>>> 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, если эта сеть является надсетью other.

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

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

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

Значение AddressValueError указывается, если address не является допустимым 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-адреса, принадлежащие сети, за исключением адреса anycast подсети-маршрутизатора. Для сетей с длиной маски 127 в результат также включается сетевой адрес подсети-маршрутизатора. Сети с маской 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 с IPV44, IPv6 с IPV66).

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

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

Итерация

Сетевые объекты можно перебирать, чтобы получить список всех адресов, принадлежащих сети. Для перебора возвращаются все хосты, включая неиспользуемые хосты (для используемых хостов используйте метод 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 с IPV44, IPv6 с IPV66).

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

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

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

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

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

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

ipaddress.v4_int_to_packed(address)

Представляет адрес в виде 4 упакованных байт в сетевом порядке (в порядке возрастания). address - это целочисленное представление IP-адреса IPv4. Значение ValueError задается, если целое число отрицательное или слишком большое, чтобы быть IP-адресом 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 упакованных байт в сетевом порядке (в порядке возрастания). address - это целочисленное представление IP-адреса IPv6. Значение ValueError задается, если целое число отрицательное или слишком большое для IP-адреса IPv6.

ipaddress.summarize_address_range(first, last)

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

obj - это либо сетевой, либо адресный объект.

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

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

exception ipaddress.AddressValueError(ValueError)

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

exception ipaddress.NetmaskValueError(ValueError)

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

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