Объекты IP-адресов хешируются, поэтому их можно использовать в качестве ключей в словарях.
import ipaddress # для IP4-адреса ipAddr = ipaddress.IPv4Address(address) # для IP6-адреса ipAddr = ipaddress.IPv6Address(address)
address
- представление IP-адреса.IPv4Address
/IPv6Address
соответственно.ipaddress.IPv4Address()
:Класс ipaddress.IPv4Address()
создает объект IPv4-адреса. Если адрес не является допустимым адресом IPv4, то возникает ошибка AddressValueError
.
Аргумент address
для IPv4Address
:
>>> 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
:
'0000:0000:0000:0000:0000:0abc:0007:0def'
можно сжать до ':: abc:7:def'
.Необязательно, строка также может иметь идентификатор зоны области действия, выраженный суффиксом %scope_id
. Если присутствует,то идентификатор области не должен быть пустым и не может содержать %.
Подробнее в RFC 4007. Например, 'fe80::1234%1
может идентифицировать адрес fe80::1234
на первом звене узла.>>> 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.max_prefixlen
общее количество бит адреса,ipAddr.compressed
краткая форма представления IPv6-адреса,ipAddr.exploded
расширенная форма представления IPv6-адреса,ipAddr.packed
двоичное представление адреса,ipAddr.reverse_pointer
DNS PTR для IP-адреса,ipAddr.is_multicast
адрес зарезервирован для multicast
,ipAddr.is_private
адрес выделен для частных сетей,ipAddr.is_global
адрес выделен для общедоступных сетей,ipAddr.is_unspecified
адрес не указан,ipAddr.is_reserved
адрес НЕ зарезервирован IETF,ipAddr.is_loopback
представляет собой петлю loopback
,ipAddr.is_link_local
адрес для локальной сети,ipAddr.is_site_local
адрес для локального использования,ipAddr.ipv6_mapped
(добавлено в Python 3.13) если IPv4 имеет отображение на IPv6-адрес, ipAddr.ipv4_mapped
если IPv6 имеет отображение на IPv4-адрес,ipAddr.scope_id
зона области действия адреса,ipAddr.sixtofour
если IPv6 имеет встроенный IPv4-адрес,ipAddr.teredo
выглядят как адреса Teredo,ipAddr.__format__()
строковое представление 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_private
равно False
для общего адресного пространства (100.64.0.0/10)
для IPv4-сопоставленных IPv6-адресов значение ipAddr.is_private
определяется семантикой базовых IPv4-адресов и выполняется следующее условие (смотрите IPv6Address.ipv4_mapped
):
address.is_private == address.ipv4_mapped.is_private
ipAddr.is_private
имеет значение, противоположное ipAddr.is_global
, за исключением общего адресного пространства (диапазон 100.64.0.0 / 10), где они оба равны False
.
Изменено в Python 3.13: Исправлены некоторые ложноположительные и ложноотрицательные результаты.
- 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. Исключения не считаются частными.
ipAddr.is_global
:Атрибут ipAddr.is_global
возвращает True
, если адрес определен как глобально доступный с помощью iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6), за следующим исключением:
Для IPv4-сопоставленных IPv6-адресов значение ipAddr.is_private определяется семантикой базовых IPv4-адресов и выполняется следующее условие (смотрите IPv6Address.ipv4_mapped
):
address.is_private == address.ipv4_mapped.is_private
ipAddr.is_global
имеет значение, противоположное ipAddr.is_private
, за исключением общего адресного пространства (диапазон 100.64.0.0 / 10), где они оба равны False
.
Изменено в Python 3.13: исправлены некоторые ложноположительные и ложноотрицательные результаты, подробности смотрите в разделе
ipAddr.is_private
.
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.ipv6_mapped
:Добавлено в Python 3.13.
Атрибут ipAddr.ipv6_mapped
только для IPv4-адресов, возвращает объект IPv4address
, представляющий IPv4-сопоставленный IPv6-адрес. Смотрите RFC 4291.
ipAddr.ipv4_mapped
:Атрибут ipAddr.ipv4_mapped
только для IPv6-адресов, которые выглядят как адреса, сопоставленные с 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'
Обратите внимание, что адреса в области 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
Операторы сравнения могут применяться только между совместимыми объектами (например, 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-адресов можно вычитать или добавлять к ним целые числа.
Некоторые примеры:
>>> 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