Сообщить об ошибке.

Объекты IPv4Address() и IPv6Address() модуля ipaddress в Python

Создание объекта IPv4 и IPv6 адреса

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

Синтаксис:

import ipaddress

# для IP4-адреса
ipAddr = ipaddress.IPv4Address(address)

# для IP6-адреса
ipAddr = ipaddress.IPv6Address(address)

Параметры:

  • address - представление IP-адреса.

Возвращаемое значение:

Описание:

ipaddress.IPv4Address():

Класс ipaddress.IPv4Address() создает объект IPv4-адреса. Если адрес не является допустимым адресом IPv4, то возникает ошибка AddressValueError.

Аргумент address для IPv4Address:

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

Класс ipaddress.IPv6Address() создает объект IPv6-адреса. Если адрес не является допустимым адресом IPv6, то возникает ошибка AddressValueError.

Аргумент address для IPv6Address:

  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. Целое число, упакованное в байтовый объект длиной 16, с прямым порядком байтов.
>>> ipaddress.IPv6Address('2001:db8::1000')
# IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('ff02::5678%1')
# IPv6Address('ff02::5678%1')

Атрибуты и методы IPv4Address/IPv6Address объектов:

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


ipAddr.version:

Атрибут ipAddr.version возвращает соответствующий номер версии протокола: 4 для IPv4, 6 для IPv6.

ipAddr.max_prefixlen:

Атрибут ipAddr.max_prefixlen возвращает общее количество бит в представлении адреса для этой версии: 32 для IPv4, 128 для IPv6.

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

ipAddr.compressed:

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

Атрибут IPv6Address.compressed краткая форма представления IPv6-адреса, в которой начальные нули в группах опущены, а самая длинная последовательность групп, полностью состоящая из нулей, свернута в одну пустую группу.

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

ipAddr.exploded:

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

Атрибут IPv6Address.exploded представляет собой полную форму представления адреса со всеми ведущими нулями и группами, полностью состоящими из нулей.

ipAddr.packed:

Атрибут ipAddr.packed - двоичное представление этого адреса - байтовый объект соответствующей длины (сначала старший значащий октет).

Составляет 4 байта для IPv4 и 16 байтов для IPv6.

ipAddr.reverse_pointer:

Атрибут ipAddr.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, а не само разрешенное имя хоста.

ipAddr.is_multicast:

Атрибут ipAddr.is_multicast возвращает True, если адрес зарезервирован для многоадресного использования.

Подробнее смотрите RFC 3171 (для IPv4) или RFC 2373 (для IPv6).

ipAddr.is_private:

Атрибут ipAddr.is_private возвращает True, если адрес выделен для частных сетей.

Подробнее смотрите Iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6).

ipAddr.is_global:

Атрибут ipAddr.is_global возвращает True, если адрес выделен для общедоступных сетей.

Подробнее смотрите Iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6).

ipAddr.is_unspecified:

Атрибут ipAddr.is_unspecified возвращает True, если адрес не указан.

Подробнее смотрите RFC 5735 (для IPv4) или RFC 2373 (для IPv6).

ipAddr.is_reserved:

Атрибут ipAddr.is_reserved возвращает True, если адрес НЕ зарезервирован IETF.

ipAddr.is_loopback:

Атрибут ipAddr.is_loopback возвращает True, если это адрес представляет собой петлю loopback.

Подробнее смотрите RFC 3330 (для IPv4) или RFC 2373 (для IPv6).

ipAddr.is_link_local:

Атрибут ipAddr.is_link_local возвращает True, если адрес зарезервирован для использования в локальной сети.

Подробнее смотрите RFC 3927.

ipAddr.is_site_local:

Атрибут ipAddr.is_site_local только для IPv6-адресов возвращает True, если адрес зарезервирован для локального использования.

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

ipAddr.ipv4_mapped:

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

ipAddr.scope_id:

Атрибут ipAddr.scope_id только для IPv6-адресов с ограниченной областью действия, как определено в RFC 4007, это свойство определяет конкретную зону области действия адреса, которой принадлежит адрес, в виде строки.

Если зона области не указана, это свойство будет None.

ipAddr.sixtofour:

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

ipAddr.teredo:

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

ipAddr.__format__(fmt):

Новое в Pythom 3.9.

Метод ipAddr.__format__() возвращает строковое представление IP-адреса, управляемое явной строкой формата.

Аргумент fmt может быть одним из следующих:

  • 's', параметр по умолчанию, эквивалентный str(),
  • 'b' для двоичной строки с нулями, -
  • 'X' или 'x' для шестнадцатеричного представления верхнего или нижнего регистра,
  • 'n', что эквивалентно 'b' для адресов IPv4 и 'x' для IPv6.

Для двоичного и шестнадцатеричного представления доступны спецификатор формы '#' и параметр группировки '_'. Метод __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'

Операции, поддерживаемые объектами IP-адреса.

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

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

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

Cравнение IP-адресов.

Операторы сравнения могут применяться только между совместимыми объектами (например, IPv4 с IPv4, 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

Обратите внимание, что одинаковые IPv6-адреса с разными идентификаторами зоны видимости не равны.

Арифметические операции с объектами IP-адресов

Из объектов IP-адресов можно вычитать или добавлять к ним целые числа.

Некоторые примеры:

>>> IPv4Address('127.0.0.2') + 3
>>> 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 addressIPv4Address('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