ipaddress
— Библиотека манипуляций с IPv4/IPv6¶
Источник: Lib/ipaddress.py
ipaddress
предоставляет возможности для создания, манипулирования и работы с адресами и сетями IPv4 и IPv6.
Функции и классы этого модуля позволяют легко решать различные задачи, связанные с IP-адресами, включая проверку того, находятся ли два хоста в одной подсети, итерацию по всем хостам в определенной подсети, проверку того, представляет ли строка действительный IP-адрес или определение сети, и так далее.
Это полная справка по API модуля - для обзора и введения смотрите Знакомство с модулем ipaddress.
Added in version 3.3.
Удобные заводские функции¶
Модуль ipaddress
предоставляет заводские функции для удобного создания IP-адресов, сетей и интерфейсов:
- ipaddress.ip_address(address)¶
Возвращает объект
IPv4Address
илиIPv6Address
в зависимости от IP-адреса, переданного в качестве аргумента. Могут быть переданы адреса IPv4 или IPv6; целые числа меньше2**32
по умолчанию будут считаться IPv4. Если адрес не представляет собой действительный 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-адреса, переданного в качестве аргумента. адрес - это строка или целое число, представляющее 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-адрес. Если адрес не является действительным IPv4-адресом, выдается сообщение
AddressValueError
.Ниже приведены правильные IPv4-адреса:
Строка в десятичной точечной системе счисления, состоящая из четырех десятичных целых чисел в диапазоне 0–255, разделенных точками (например,
192.168.0.1
). Каждое целое число представляет собой октет (байт) в адресе. Ведущие нули не допускаются, чтобы избежать путаницы с восьмеричной системой счисления.Целое число, умещающееся в 32 бита.
Целое число, упакованное в объект
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¶
Имя обратной 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-поиска, а не само разрешенное имя хоста.
Added in version 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
)Для IPv4-сопоставленных IPv6-адресов значение
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.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
. Исключения не считаются частными.
- is_global¶
True
, если адрес определен как глобально достижимый с помощью iana-ipv4-special-registry (для IPv4) или iana-ipv6-special-registry (для IPv6) со следующим исключением:Для IPv4-сопоставленных IPv6-адресов значение
is_private
определяется семантикой базовых IPv4-адресов, и при этом выполняется следующее условие (см.IPv6Address.ipv4_mapped
):address.is_global == address.ipv4_mapped.is_global
is_global
имеет значение, противоположноеis_private
, за исключением общего адресного пространства (диапазон``100.64.0.0/10``), где они оба равныFalse
.Added in version 3.4.
Изменено в версии 3.13: Исправлены некоторые ложные срабатывания и ложные отрицательные результаты, подробности см. в
is_private
.
- is_reserved¶
True
, если адрес иначе зарезервирован IETF.
- ipv6_mapped¶
Объект
IPv4Address
, представляющий IPv4-сопоставленный IPv6-адрес. См. RFC 4291.Added in version 3.13.
- 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'
Added in version 3.9.
- class ipaddress.IPv6Address(address)¶
Создайте IPv6-адрес. Если адрес не является действительным IPv6-адресом, выдается сообщение
AddressValueError
.Ниже приведены правильные IPv6-адреса:
Строка, состоящая из восьми групп по четыре шестнадцатеричных цифры, каждая из которых представляет собой 16 бит. Группы разделены двоеточиями. Это описание развернутой (длинной) нотации. Строка также может быть сжата (сокращенная нотация) различными способами. Подробности см. в разделе RFC 4291. Например,
"0000:0000:0000:0000:0000:0abc:0007:0def"
может быть сжата до"::abc:7:def"
.В качестве опции строка может содержать идентификатор зоны действия, выраженный суффиксом
%scope_id
. Если он присутствует, идентификатор зоны действия должен быть непустым и не должен содержать%
. Подробности см. в разделе RFC 4007. Например,fe80::1234%1
может идентифицировать адресfe80::1234
на первом звене узла.Целое число, умещающееся в 128 бит.
Целое число, упакованное в объект
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¶
Added in version 3.4.
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
- is_site_local¶
True
, если адрес зарезервирован для локального использования. Обратите внимание, что адресное пространство site-local было упразднено RFC 3879. Используйтеis_private
, чтобы проверить, находится ли этот адрес в пространстве уникальных локальных адресов, как определено в RFC 4193.
- ipv4_mapped¶
Для адресов, которые представляются адресами, сопоставленными с IPv4 (начиная с
::FFFF/96
), это свойство будет сообщать встроенный IPv4-адрес. Для любых других адресов это свойство будетNone
.
- scope_id¶
Для скопированных адресов, как определено в RFC 4007, это свойство определяет конкретную зону области видимости адреса, к которой он принадлежит, в виде строки. Если зона видимости не указана, это свойство будет
None
.
- IPv6Address.__format__(fmt)¶
Обратитесь к документации по соответствующему методу в
IPv4Address
.Added in version 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 преобразуются в целые числа без идентификатора зоны охвата.
Операторы¶
Адресные объекты поддерживают некоторые операторы. Если не указано иное, операторы могут применяться только между совместимыми объектами (т. е. 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. Адрес может быть одним из следующих:
Строка, состоящая из 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
.Целое число, умещающееся в 32 бита. Это эквивалентно одноадресной сети, где адрес сети - адрес, а маска -
/32
.Целое число, упакованное в объект
bytes
длины 4, по старшинству. Интерпретация аналогична целочисленному адресу.Двойной кортеж из описания адреса и маски сети, где описание адреса - это либо строка, либо 32-битное целое число, либо 4-байтовое упакованное целое число, либо существующий объект
IPv4Address
; а маска сети - это либо целое число, представляющее длину префикса (например,24
), либо строка, представляющая маску префикса (например,255.255.255.0
).
Если адрес не является действительным IPv4-адресом, выдается сообщение
AddressValueError
. Если маска не является действительной для IPv4-адреса, выдается сообщениеNetmaskValueError
.Если strict равно
True
и в предоставленном адресе установлены биты хоста, то выполняется запросValueError
. В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.Если не указано иное, все методы сети, принимающие другие объекты сети/адреса, будут поднимать
TypeError
, если версия IP аргумента несовместима сself
.Изменено в версии 3.5: Добавлена форма с двумя кортежами для параметра конструктора address.
- version¶
- max_prefixlen¶
Обратитесь к документации по соответствующему атрибуту в
IPv4Address
.
- is_multicast¶
- is_private¶
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
Эти атрибуты верны для сети в целом, если они верны и для сетевого адреса, и для широковещательного адреса.
- 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
Added in version 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
Added in version 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. адрес может быть одним из следующих:
Строка, состоящая из IP-адреса и необязательной длины префикса, разделенных косой чертой (
/
). IP-адрес - это сетевой адрес, а длина префикса должна быть одним числом, префиксом. Если длина префикса не указана, он считается равным/128
.Обратите внимание, что в настоящее время расширенные нетмаски не поддерживаются. Это означает, что
2001:db00::0/24
является допустимым аргументом, а2001:db00::0/ffff:ff00::
- нет.Целое число, умещающееся в 128 бит. Это эквивалентно одноадресной сети, где сетевой адрес - адрес, а маска -
/128
.Целое число, упакованное в объект
bytes
длины 16, по старшинству. Интерпретация аналогична целочисленному адресу.Двойной кортеж из описания адреса и маски сети, где описание адреса - это либо строка, либо 128-битное целое число, либо 16-битное упакованное целое число, либо существующий объект
IPv6Address
; а маска сети - это целое число, представляющее длину префикса.
Если адрес не является действительным IPv6-адресом, выдается сообщение
AddressValueError
. Если маска не является действительной для IPv6-адреса, выдается сообщениеNetmaskValueError
.Если strict равно
True
и в предоставленном адресе установлены биты хоста, то выполняется запросValueError
. В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.Изменено в версии 3.5: Добавлена форма с двумя кортежами для параметра конструктора address.
- version¶
- max_prefixlen¶
- is_multicast¶
- is_private¶
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
- 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. Если целое число отрицательно или слишком велико, чтобы быть IP-адресом IPv4, выдается сообщение
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. Если целое число отрицательно или слишком велико, чтобы быть IP-адресом IPv6, выдается сообщение
ValueError
.
- 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
. Если 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)¶
Любая ошибка значения, связанная с маской сети.