Spec-Zone.ru › Python 3.9

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

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 соответствующей длины (самый старший октет первым). Для IPv4 — 4 байта, для IPv6 — 16 байт.

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_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 если это адрес обратной связи. См. RFC 3330 (для IPv4) или RFC 2373 (для IPv6).

is_link_local

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
is_link_local

Новый в версии 3.4: is_global

is_site_local

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

ipv4_mapped

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

scope_id

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

sixtofour

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

teredo

Для адресов, которые, по-видимому, являются адресами Teredo (начинающимися с 2001::/32) согласно RFC 4380, это свойство вернёт вложенную пару адресов (server, client) IP. Для любого другого адреса это свойство будет 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 с зоной действия преобразуются в целые числа без идентификатора зоны действия.

Операторы

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

END_OF_DOCUMENT_MARKER ```

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

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

class ipaddress.IPv4Network(address, strict=True)

Создает определение сети IPv4. address может быть одним из следующих:

  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 байта, в формате big-endian. Интерпретация аналогична целочисленному address.
  4. Двухэлементный кортеж из описания адреса и маски сети, где описание адреса — это либо строка, целочисленное значение 32 бит, упакованное целое число 4 байта или существующий объект IPv4Address; а маска сети — это либо целое число, представляющее длину префикса (например, 24) или строка, представляющая маску префикса (например, 255.255.255.0).

Если address не является допустимым 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

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

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

address_exclude(network)

Вычисляет определения сетей, полученные в результате удаления заданной сети из этой. Возвращает итератор объектов сети. Возбуждает ValueError, если network не полностью содержится в этой сети.

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

Сравнивает эту сеть с 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. address может быть одним из следующих:

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

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

  2. Целое число, которое помещается в 128 бит. Это эквивалентно сети с одним адресом, где адрес сети — address, а маска — /128.
  3. Целое число, упакованное в объект bytes длиной 16 байт, в формате big-endian. Интерпретация аналогична целому числу address.
  4. Двухэлементный кортеж из описания адреса и маски подсети, где описание адреса — это строка, целое число 128 бит, упакованное целое число 16 байт или существующий объект IPv6Address; а маска подсети — целое число, представляющее длину префикса.

Если address не является допустимым 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-адреса, принадлежащие сети, за исключением адресной группы anycast роутера подсети. Для сетей с длиной маски 127 адресной группе 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

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

Операторы

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

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

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

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

ipaddress.summarize_address_range(first, last)

Возвращает итератор с суммарным диапазоном сети, заданным начальным и конечным IP-адресами. first — первый IPv4Address или IPv6Address в диапазоне, а last — последний IPv4Address или IPv6Address в диапазоне. Если first или last не являются IP-адресами или не имеют одинаковой версии, возникает TypeError. Если last не больше first или версия адреса first не 4 или 6, возникает ValueError.

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

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

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

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

exception ipaddress.AddressValueError(ValueError)

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

exception ipaddress.NetmaskValueError(ValueError)

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

© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/ipaddress.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API