Документация Python неофициальный перевод

ipaddress.md

681 строк · 44.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.5/library/ipaddress.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 21.28. [`ipaddress`](https://python-all.ru/3.5/library/ipaddress.html#module-ipaddress) – библиотека для работы с IPv4/IPv689**Исходный код:** [Lib/ipaddress.py](https://python-all.ru/src/3.5/Lib/ipaddress.py)1011---1213[`ipaddress`](https://python-all.ru/3.5/library/ipaddress.html#module-ipaddress) предоставляет возможности для создания, изменения и работы с IPv4- и IPv6-адресами и сетями.1415Функции и классы этого модуля упрощают выполнение различных задач, связанных с IP-адресами: проверку, находятся ли два хоста в одной подсети; перебор всех хостов в заданной подсети; проверку, является ли строка корректным IP-адресом или определением сети, и так далее.1617Это полная справочная информация по модулю API. Обзор и введение см. в [Введение в модуль ipaddress](https://python-all.ru/3.5/howto/ipaddress.html#ipaddress-howto).1819Новое в версии 3.3.2021## 21.28.1. Удобные фабричные функции2223Модуль [`ipaddress`](https://python-all.ru/3.5/library/ipaddress.html#module-ipaddress) предоставляет фабричные функции для удобного создания IP-адресов, сетей и интерфейсов:2425#### `ipaddress.ip_address(address)`2627Возвращает объект [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address) или [`IPv6Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Address) в зависимости от IP-адреса, переданного в качестве аргумента. Можно передавать как IPv4-, так и IPv6-адреса; целые числа меньше 2\*\*32 по умолчанию считаются IPv4. Исключение [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) возбуждается, если *address* не является корректным IPv4- или IPv6-адресом.2829```python30>>> ipaddress.ip_address('192.168.0.1')31IPv4Address('192.168.0.1')32>>> ipaddress.ip_address('2001:db8::')33IPv6Address('2001:db8::')34```3536#### `ipaddress.ip_network(address, strict=True)`3738Возвращает объект [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network) или [`IPv6Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Network) в зависимости от IP-адреса, переданного в качестве аргумента. *address* – это строка или целое число, представляющее IP-сеть. Можно передавать как IPv4-, так и IPv6-сети; целые числа меньше 2\*\*32 по умолчанию считаются IPv4. Параметр *strict* передаётся конструктору [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network) или [`IPv6Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Network). Исключение [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) возбуждается, если *address* не является корректным IPv4- или IPv6-адресом, или если в сети установлены биты узла.3940```python41>>> ipaddress.ip_network('192.168.0.0/28')42IPv4Network('192.168.0.0/28')43```4445#### `ipaddress.ip_interface(address)`4647Возвращает объект [`IPv4Interface`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Interface) или [`IPv6Interface`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Interface) в зависимости от IP-адреса, переданного в качестве аргумента. *address* – это строка или целое число, представляющее IP-адрес. Можно передавать как IPv4-, так и IPv6-адреса; целые числа меньше 2\*\*32 по умолчанию считаются IPv4. Исключение [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) возбуждается, если *address* не является корректным IPv4- или IPv6-адресом.4849Недостаток этих удобных функций в том, что необходимость поддержки обоих форматов – IPv4 и IPv6 – приводит к тому, что сообщения об ошибках содержат минимум информации о точной ошибке, поскольку функции не знают, какой формат предполагался. Более подробные сообщения об ошибках можно получить, напрямую вызывая соответствующие версии конструкторов классов.5051## 21.28.2. IP-адреса5253### 21.28.2.1. Объекты адресов5455Объекты [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address) и [`IPv6Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Address) имеют много общих атрибутов. Некоторые атрибуты, имеющие смысл только для IPv6-адресов, также реализованы в объектах [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address), чтобы упростить написание кода, корректно работающего с обеими версиями IP.5657#### `class ipaddress.IPv4Address(address)`5859Создаёт IPv4-адрес. Если *address* не является корректным IPv4-адресом, возбуждается [`AddressValueError`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.AddressValueError).6061Корректным IPv4-адресом считается следующее:62631. Строка в десятично-точечной записи, состоящая из четырёх десятичных целых чисел в диапазоне от 0 до 255 включительно, разделённых точками (например, `192.168.0.1`). Каждое число представляет октет (байт) адреса. Начальные нули допускаются только для значений меньше 8 (поскольку в таких строках нет неоднозначности между десятичной и восьмеричной интерпретацией).642. Целое число, помещающееся в 32 бита.653. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) длиной 4 (сначала старший октет).6667```python68>>> ipaddress.IPv4Address('192.168.0.1')69IPv4Address('192.168.0.1')70>>> ipaddress.IPv4Address(3232235521)71IPv4Address('192.168.0.1')72>>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')73IPv4Address('192.168.0.1')74```7576#### `version`7778Соответствующий номер версии: `4` для IPv4, `6` для IPv6.7980#### `max_prefixlen`8182Общее количество бит в представлении адреса для данной версии: `32` для IPv4, `128` для IPv6.8384Префикс определяет количество старших бит в адресе, которые сравниваются, чтобы определить, принадлежит ли адрес сети.8586#### `compressed`8788#### `exploded`8990Строковое представление в десятичной записи с точками. Начальные нули никогда не включаются в представление.9192Поскольку IPv4 не определяет сокращённой записи для адресов, в которых октеты равны нулю, эти два атрибута всегда совпадают с `str(addr)` для IPv4-адресов. Наличие этих атрибутов упрощает написание кода отображения, способного работать как с IPv4-, так и с IPv6-адресами.9394#### `packed`9596Двоичное представление этого адреса – объект [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) соответствующей длины (сначала старший октет). Это 4 байта для IPv4 и 16 байт для IPv6.9798#### `reverse_pointer`99100Имя обратной PTR-записи DNS для IP-адреса, например:101102```python103>>> ipaddress.ip_address("127.0.0.1").reverse_pointer104'1.0.0.127.in-addr.arpa'105>>> ipaddress.ip_address("2001:db8::1").reverse_pointer106'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'107```108109Это имя, которое можно использовать для выполнения PTR-запроса, а не разрешённое имя узла.110111Новое в версии 3.5.112113#### `is_multicast`114115`True`, если адрес зарезервирован для многоадресной рассылки. См. [**RFC 3171**](https://python-all.ru/3.5/library/ipaddress.html) (для IPv4) или [**RFC 2373**](https://python-all.ru/3.5/library/ipaddress.html) (для IPv6).116117#### `is_private`118119`True`, если адрес выделен для частных сетей. См. [iana-ipv4-special-registry](https://python-all.ru/3.5/library/ipaddress.html) (для IPv4) или [iana-ipv6-special-registry](https://python-all.ru/3.5/library/ipaddress.html) (для IPv6).120121#### `is_global`122123`True`, если адрес выделен для публичных сетей. См. [iana-ipv4-special-registry](https://python-all.ru/3.5/library/ipaddress.html) (для IPv4) или [iana-ipv6-special-registry](https://python-all.ru/3.5/library/ipaddress.html) (для IPv6).124125Новое в версии 3.4.126127#### `is_unspecified`128129`True`, если адрес не определён. См. [**RFC 5735**](https://python-all.ru/3.5/library/ipaddress.html) (для IPv4) или [**RFC 2373**](https://python-all.ru/3.5/library/ipaddress.html) (для IPv6).130131#### `is_reserved`132133`True` если адрес зарезервирован IETF.134135#### `is_loopback`136137`True`, если это адрес loopback. См. [**RFC 3330**](https://python-all.ru/3.5/library/ipaddress.html) (для IPv4) или [**RFC 2373**](https://python-all.ru/3.5/library/ipaddress.html) (для IPv6).138139#### `is_link_local`140141`True`, если адрес зарезервирован для использования в link-local. См. [**RFC 3927**](https://python-all.ru/3.5/library/ipaddress.html).142143#### `class ipaddress.IPv6Address(address)`144145Создаёт IPv6-адрес. [`AddressValueError`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.AddressValueError) возникает, если *address* не является допустимым IPv6-адресом.146147Допустимый IPv6-адрес образуется следующим образом:1481491. Строка из восьми групп по четыре шестнадцатеричных цифры, каждая группа представляет 16 бит. Группы разделяются двоеточиями. Это описывает *развёрнутую* (полную) запись. Строка также может быть *сжата* (краткая запись) различными способами. Подробнее см. [**RFC 4291**](https://python-all.ru/3.5/library/ipaddress.html). Например, `"0000:0000:0000:0000:0000:0abc:0007:0def"` можно сжать до `"::abc:7:def"`.1502. Целое число, помещающееся в 128 бит.1513. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) длиной 16, big-endian.152153```python154>>> ipaddress.IPv6Address('2001:db8::1000')155IPv6Address('2001:db8::1000')156```157158#### `compressed`159160Краткая форма представления адреса, в которой опущены ведущие нули в группах, а самая длинная последовательность групп, состоящих полностью из нулей, сжата в одну пустую группу.161162Это также значение, возвращаемое `str(addr)` для IPv6-адресов.163164#### `exploded`165166Полная форма представления адреса, включающая все ведущие нули и группы, состоящие полностью из нулей.167168Для следующих атрибутов обратитесь к соответствующей документации класса [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address):169170#### `packed`171172#### `reverse_pointer`173174#### `version`175176#### `max_prefixlen`177178#### `is_multicast`179180#### `is_private`181182#### `is_global`183184#### `is_unspecified`185186#### `is_reserved`187188#### `is_loopback`189190#### `is_link_local`191192Новое в версии 3.4: is\_global193194#### `is_site_local`195196`True` если адрес зарезервирован для использования в локальной сети (site-local). Обратите внимание, что пространство адресов site-local признано устаревшим согласно [**RFC 3879**](https://python-all.ru/3.5/library/ipaddress.html). Используйте [`is_private`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address.is_private) для проверки, принадлежит ли этот адрес пространству уникальных локальных адресов, определённому в [**RFC 4193**](https://python-all.ru/3.5/library/ipaddress.html).197198#### `ipv4_mapped`199200Для адресов, которые выглядят как IPv4-mapped адреса (начинающихся с `::FFFF/96`), это свойство возвращает встроенный IPv4-адрес. Для всех остальных адресов это свойство будет `None`.201202#### `sixtofour`203204Для адресов, которые выглядят как адреса 6to4 (начинающиеся с `2002::/16`), определённые в [**RFC 3056**](https://python-all.ru/3.5/library/ipaddress.html), это свойство возвращает встроенный IPv4-адрес. Для любого другого адреса это свойство будет `None`.205206#### `teredo`207208Для адресов, которые выглядят как адреса Teredo (начинающиеся с `2001::/32`), определённые в [**RFC 4380**](https://python-all.ru/3.5/library/ipaddress.html), это свойство возвращает встроенную пару `(server, client)` IP-адресов. Для любого другого адреса это свойство будет `None`.209210### 21.28.2.2. Преобразование в строки и целые числа211212Для взаимодействия с сетевыми интерфейсами, такими как модуль socket, адреса должны быть преобразованы в строки или целые числа. Это делается с помощью встроенных функций [`str()`](https://python-all.ru/3.5/library/stdtypes.html#str) и [`int()`](https://python-all.ru/3.5/library/functions.html#int):213214```python215>>> str(ipaddress.IPv4Address('192.168.0.1'))216'192.168.0.1'217>>> int(ipaddress.IPv4Address('192.168.0.1'))2183232235521219>>> str(ipaddress.IPv6Address('::1'))220'::1'221>>> int(ipaddress.IPv6Address('::1'))2221223```224225### 21.28.2.3. Операторы226227Объекты адресов поддерживают некоторые операторы. Если не указано иное, операторы могут применяться только между совместимыми объектами (т.е. IPv4 с IPv4, IPv6 с IPv6).228229#### 21.28.2.3.1. Операторы сравнения230231Объекты адресов можно сравнивать с помощью обычных операторов сравнения. Несколько примеров:232233```python234>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')235True236>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')237False238>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')239True240```241242#### 21.28.2.3.2. Арифметические операторы243244Целые числа можно прибавлять к объектам адресов или вычитать из них. Несколько примеров:245246```python247>>> IPv4Address('127.0.0.2') + 3248IPv4Address('127.0.0.5')249>>> IPv4Address('127.0.0.2') - 3250IPv4Address('126.255.255.255')251>>> IPv4Address('255.255.255.255') + 1252Traceback (most recent call last):253  File "<stdin>", line 1, in <module>254ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address255```256257## 21.28.3. Определения IP-сетей258259Объекты [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network) и [`IPv6Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Network) предоставляют механизм для определения и изучения определений IP-сетей. Определение сети состоит из *маски* и *сетевого адреса* и, таким образом, определяет диапазон IP-адресов, которые равны сетевому адресу при наложении маски (побитовое И) с маской. Например, определение сети с маской `255.255.255.0` и сетевым адресом `192.168.1.0` включает IP-адреса в диапазоне от `192.168.1.0` до `192.168.1.255` включительно.260261### 21.28.3.1. Префикс, маска сети и маска хоста262263Существует несколько эквивалентных способов указания масок IP-сетей. *Префикс* `/<nbits>` – это обозначение, показывающее, сколько старших битов установлено в маске сети. *Маска сети* – это IP-адрес, в котором установлено некоторое количество старших битов. Таким образом, префикс `/24` эквивалентен маске сети `255.255.255.0` в IPv4 или `ffff:ff00::` в IPv6. Кроме того, *маска хоста* является логическим отрицанием *маски сети* и иногда используется (например, в списках управления доступом Cisco) для обозначения маски сети. Маска хоста, эквивалентная `/24` в IPv4, – это `0.0.0.255`.264265### 21.28.3.2. Объекты сетей266267Все атрибуты, реализованные объектами адресов, также реализованы и объектами сетей. Кроме того, объекты сетей реализуют дополнительные атрибуты. Все они являются общими для [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network) и [`IPv6Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Network), поэтому во избежание дублирования они документированы только для [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network).268269#### `class ipaddress.IPv4Network(address, strict=True)`270271Создаёт определение IPv4-сети. *адрес* может быть одним из следующих:2722731. Строка, содержащая IP-адрес и необязательную маску, разделённые косой чертой (`/`). IP-адрес является сетевым адресом, а маска может быть либо числом, которое означает *префикс*, либо строковым представлением IPv4-адреса. Во втором случае маска интерпретируется как *маска сети*, если она начинается с ненулевого поля, или как *маска хоста*, если начинается с нулевого поля. Если маска не указана, считается, что она равна `/32`.274275   Например, следующие спецификации *адрес* эквивалентны: `192.168.1.0/24`, `192.168.1.0/255.255.255.0` и `192.168.1.0/0.0.0.255`.2762. Целое число, помещающееся в 32 бита. Оно эквивалентно сети с одним адресом, где адресом сети является *address*, а маской – `/32`.2773. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) длиной 4 байта, с порядком от старшего к младшему. Интерпретация аналогична целочисленному *адресу*.2784. Кортеж из двух элементов: описание адреса и маска сети, где описание адреса может быть строкой, 32-битным целым числом, упакованным 4-байтовым целым или существующим объектом IPv4Address; а маска сети – либо целым числом, представляющим длину префикса (например, `24`), либо строкой, представляющей маску префикса (например, `255.255.255.0`).279280Исключение [`AddressValueError`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.AddressValueError) возбуждается, если *адрес* не является допустимым IPv4-адресом. Исключение [`NetmaskValueError`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.NetmaskValueError) возбуждается, если маска недопустима для IPv4-адреса.281282Если *strict* равен `True` и в предоставленном адресе установлены биты хоста, вызывается [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError). В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.283284Если не указано иное, все методы сетей, принимающие другие объекты сетей/адресов, возбуждают [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError), если версия IP аргумента несовместима с `self`285286Изменено в версии 3.5: Добавлена двухэлементная форма для параметра конструктора *address*.287288#### `version`289290#### `max_prefixlen`291292Обратитесь к соответствующей документации атрибута в [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address)293294#### `is_multicast`295296#### `is_private`297298#### `is_unspecified`299300#### `is_reserved`301302#### `is_loopback`303304#### `is_link_local`305306Эти атрибуты истинны для сети в целом, если они истинны как для сетевого адреса, так и для широковещательного адреса307308#### `network_address`309310Сетевой адрес для этой сети. Сетевой адрес и длина префикса вместе однозначно определяют сеть.311312#### `broadcast_address`313314Широковещательный адрес для этой сети. Пакеты, отправленные на широковещательный адрес, должны быть получены каждым хостом в сети.315316#### `hostmask`317318Маска хоста в виде строки.319320#### `with_prefixlen`321322#### `compressed`323324#### `exploded`325326Строковое представление сети с маской в префиксной нотации.327328`with_prefixlen` и `compressed` всегда совпадают с `str(network)`. `exploded` использует развёрнутую форму сетевого адреса.329330#### `with_netmask`331332Строковое представление сети с маской в нотации маски сети.333334#### `with_hostmask`335336Строковое представление сети с маской в нотации хостовой маски.337338#### `num_addresses`339340Общее количество адресов в сети.341342#### `prefixlen`343344Длина префикса сети в битах.345346#### `hosts()`347348Возвращает итератор по доступным хостам в сети. Доступные хосты – это все IP-адреса, принадлежащие сети, за исключением самого сетевого адреса и широковещательного адреса сети.349350```python351>>> list(ip_network('192.0.2.0/29').hosts())  #doctest: +NORMALIZE_WHITESPACE352[IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),353 IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),354 IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]355```356357#### `overlaps(other)`358359`True`, если данная сеть частично или полностью содержится в *другом* или *другой* полностью содержится в данной сети.360361#### `address_exclude(network)`362363Вычисляет определения сети, получающиеся при удалении указанной *сети* из данной. Возвращает итератор объектов сети. Вызывает [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError), если *сеть* не полностью содержится в данной сети.364365```python366>>> n1 = ip_network('192.0.2.0/28')367>>> n2 = ip_network('192.0.2.1/32')368>>> list(n1.address_exclude(n2))  #doctest: +NORMALIZE_WHITESPACE369[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),370 IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]371```372373#### `subnets(prefixlen_diff=1, new_prefix=None)`374375Подсети, объединение которых образует текущее определение сети, в зависимости от значений аргументов. *prefixlen\_diff* – это величина, на которую должна быть увеличена длина нашего префикса. *new\_prefix* – это желаемый новый префикс подсетей; он должен быть больше нашего префикса. Должен быть задан ровно один из *prefixlen\_diff* и *new\_prefix*. Возвращает итератор объектов сети.376377```python378>>> list(ip_network('192.0.2.0/24').subnets())379[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]380>>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))  #doctest: +NORMALIZE_WHITESPACE381[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),382 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]383>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26))  #doctest: +NORMALIZE_WHITESPACE384[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),385 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]386>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))387Traceback (most recent call last):388  File "<stdin>", line 1, in <module>389    raise ValueError('new prefix must be longer')390ValueError: new prefix must be longer391>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))392[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]393```394395#### `supernet(prefixlen_diff=1, new_prefix=None)`396397Суперсеть, содержащая данное определение сети, в зависимости от значений аргументов. *prefixlen\_diff* – это величина, на которую должна быть уменьшена длина нашего префикса. *new\_prefix* – это желаемый новый префикс суперсети; он должен быть меньше нашего префикса. Должен быть задан ровно один из *prefixlen\_diff* и *new\_prefix*. Возвращает один объект сети.398399```python400>>> ip_network('192.0.2.0/24').supernet()401IPv4Network('192.0.2.0/23')402>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)403IPv4Network('192.0.0.0/22')404>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)405IPv4Network('192.0.0.0/20')406```407408#### `compare_networks(other)`409410Сравнивает данную сеть с *другим*. При таком сравнении учитываются только сетевые адреса; биты хоста не учитываются. Возвращает `-1`, `0` или `1`.411412```python413>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))414-1415>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))4161417>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))4180419```420421#### `class ipaddress.IPv6Network(address, strict=True)`422423Создаёт определение IPv6-сети. *адрес* может быть одним из следующих:4244251. Строка, содержащая IP-адрес и необязательную маску, разделённые косой чертой (`/`). IP-адрес является сетевым адресом, а маска может быть либо числом, которое означает *префикс*, либо строковым представлением IPv6-адреса. Во втором случае маска интерпретируется как *маска сети*. Если маска не указана, считается, что она равна `/128`.426427   Например, следующие спецификации *адреса* эквивалентны: `2001:db00::0/24` и `2001:db00::0/ffff:ff00::`.4282. Целое число, помещающееся в 128 бит. Это эквивалентно сети с одним адресом, где сетевым адресом является *адрес*, а маской – `/128`.4293. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) длиной 16 байт, порядок байтов от старшего к младшему. Интерпретация аналогична целому числу *адрес*.4304. Двухэлементный кортеж из описания адреса и маски подсети, где описание адреса может быть строкой, 128-битным целым числом, 16-байтовым упакованным целым числом или существующим объектом IPv6Address; а маска подсети – это целое число, представляющее длину префикса.431432[`AddressValueError`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.AddressValueError) вызывается, если *адрес* не является допустимым IPv6-адресом. [`NetmaskValueError`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.NetmaskValueError) вызывается, если маска недопустима для IPv6-адреса.433434Если *strict* равен `True` и в предоставленном адресе установлены биты хоста, вызывается [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError). В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.435436Изменено в версии 3.5: Добавлена двухэлементная форма для параметра конструктора *address*.437438#### `version`439440#### `max_prefixlen`441442#### `is_multicast`443444#### `is_private`445446#### `is_unspecified`447448#### `is_reserved`449450#### `is_loopback`451452#### `is_link_local`453454#### `network_address`455456#### `broadcast_address`457458#### `hostmask`459460#### `with_prefixlen`461462#### `compressed`463464#### `exploded`465466#### `with_netmask`467468#### `with_hostmask`469470#### `num_addresses`471472#### `prefixlen`473474#### `hosts()`475476#### `overlaps(other)`477478#### `address_exclude(network)`479480#### `subnets(prefixlen_diff=1, new_prefix=None)`481482#### `supernet(prefixlen_diff=1, new_prefix=None)`483484#### `compare_networks(other)`485486Обратитесь к соответствующей документации атрибута в [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network)487488#### `is_site_local`489490Этот атрибут истинен для всей сети, если он истинен как для сетевого адреса, так и для широковещательного адреса.491492### 21.28.3.3. Операторы493494Сетевые объекты поддерживают некоторые операторы. Если не указано иное, операторы можно применять только между совместимыми объектами (например, IPv4 с IPv4, IPv6 с IPv6).495496#### 21.28.3.3.1. Логические операторы497498Сетевые объекты можно сравнивать с помощью стандартного набора логических операторов, аналогично адресным объектам.499500#### 21.28.3.3.2. Итерация501502Сетевые объекты можно перебирать для получения списка всех адресов, принадлежащих сети. При переборе возвращаются *все* хосты, включая непригодные для использования (для пригодных хостов используйте метод [`hosts()`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network.hosts)). Пример:503504```python505>>> for addr in IPv4Network('192.0.2.0/28'):506...     addr507...508IPv4Address('192.0.2.0')509IPv4Address('192.0.2.1')510IPv4Address('192.0.2.2')511IPv4Address('192.0.2.3')512IPv4Address('192.0.2.4')513IPv4Address('192.0.2.5')514IPv4Address('192.0.2.6')515IPv4Address('192.0.2.7')516IPv4Address('192.0.2.8')517IPv4Address('192.0.2.9')518IPv4Address('192.0.2.10')519IPv4Address('192.0.2.11')520IPv4Address('192.0.2.12')521IPv4Address('192.0.2.13')522IPv4Address('192.0.2.14')523IPv4Address('192.0.2.15')524```525526#### 21.28.3.3.3. Сети как контейнеры адресов527528Сетевые объекты могут выступать в качестве контейнеров адресов. Несколько примеров:529530```python531>>> IPv4Network('192.0.2.0/28')[0]532IPv4Address('192.0.2.0')533>>> IPv4Network('192.0.2.0/28')[15]534IPv4Address('192.0.2.15')535>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')536True537>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')538False539```540541## 21.28.4. Объекты интерфейса542543#### `class ipaddress.IPv4Interface(address)`544545Создаёт интерфейс IPv4. Значение *address* такое же, как в конструкторе [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network), за исключением того, что произвольные адреса хостов всегда принимаются.546547[`IPv4Interface`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Interface) является подклассом [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address), поэтому наследует все атрибуты этого класса. Кроме того, доступны следующие атрибуты:548549#### `ip`550551Адрес ([`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address)) без информации о сети.552553```python554>>> interface = IPv4Interface('192.0.2.5/24')555>>> interface.ip556IPv4Address('192.0.2.5')557```558559#### `network`560561Сеть ([`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network)), к которой принадлежит данный интерфейс.562563```python564>>> interface = IPv4Interface('192.0.2.5/24')565>>> interface.network566IPv4Network('192.0.2.0/24')567```568569#### `with_prefixlen`570571Строковое представление интерфейса с маской в префиксной нотации.572573```python574>>> interface = IPv4Interface('192.0.2.5/24')575>>> interface.with_prefixlen576'192.0.2.5/24'577```578579#### `with_netmask`580581Строковое представление интерфейса, где сеть указана в виде маски сети.582583```python584>>> interface = IPv4Interface('192.0.2.5/24')585>>> interface.with_netmask586'192.0.2.5/255.255.255.0'587```588589#### `with_hostmask`590591Строковое представление интерфейса, где сеть указана в виде маски хоста.592593```python594>>> interface = IPv4Interface('192.0.2.5/24')595>>> interface.with_hostmask596'192.0.2.5/0.0.0.255'597```598599#### `class ipaddress.IPv6Interface(address)`600601Создаёт интерфейс IPv6. Значение *address* такое же, как в конструкторе [`IPv6Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Network), за исключением того, что произвольные адреса хостов всегда принимаются.602603[`IPv6Interface`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Interface) является подклассом [`IPv6Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Address), поэтому наследует все атрибуты этого класса. Кроме того, доступны следующие атрибуты:604605#### `ip`606607#### `network`608609#### `with_prefixlen`610611#### `with_netmask`612613#### `with_hostmask`614615Обратитесь к соответствующей документации атрибутов в [`IPv4Interface`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Interface).616617## 21.28.5. Другие функции уровня модуля618619Модуль также предоставляет следующие функции уровня модуля:620621#### `ipaddress.v4_int_to_packed(address)`622623Представляет адрес в виде 4 упакованных байт в сетевом порядке (big-endian). *address* – это целочисленное представление IPv4-адреса. Исключение [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) возбуждается, если целое отрицательно или слишком велико для IPv4-адреса.624625```python626>>> ipaddress.ip_address(3221225985)627IPv4Address('192.0.2.1')628>>> ipaddress.v4_int_to_packed(3221225985)629b'\xc0\x00\x02\x01'630```631632#### `ipaddress.v6_int_to_packed(address)`633634Представляет адрес в виде 16 упакованных байт в сетевом порядке (big-endian). *address* – это целочисленное представление IPv6-адреса. Исключение [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) возбуждается, если целое отрицательно или слишком велико для IPv6-адреса.635636#### `ipaddress.summarize_address_range(first, last)`637638Возвращает итератор суммарного диапазона сети, заданного первым и последним IP-адресами. *first* – это первый [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address) или [`IPv6Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Address) в диапазоне, а *last* – это последний [`IPv4Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Address) или [`IPv6Address`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Address) в диапазоне. Исключение [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError) возбуждается, если *first* или *last* не являются IP-адресами или имеют разные версии. Исключение [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) возбуждается, если *last* не больше *first*, или если версия адреса *first* не равна 4 или 6.639640```python641>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(642...    ipaddress.IPv4Address('192.0.2.0'),643...    ipaddress.IPv4Address('192.0.2.130'))]644[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]645```646647#### `ipaddress.collapse_addresses(addresses)`648649Возвращает итератор по свернутым [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network) или [`IPv6Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Network) объектам. *addresses* – это итератор из [`IPv4Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv4Network) или [`IPv6Network`](https://python-all.ru/3.5/library/ipaddress.html#ipaddress.IPv6Network) объектов. Исключение [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError) возбуждается, если *addresses* содержит объекты разных версий.650651```python652>>> [ipaddr for ipaddr in653... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),654... ipaddress.IPv4Network('192.0.2.128/25')])]655[IPv4Network('192.0.2.0/24')]656```657658#### `ipaddress.get_mixed_type_key(obj)`659660Возвращает ключ, подходящий для сортировки сетей и адресов. Объекты Address и Network по умолчанию не сортируются; они принципиально разные, поэтому выражение:661662```python663IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')664```665666не имеет смысла. Однако иногда возникает необходимость заставить [`ipaddress`](https://python-all.ru/3.5/library/ipaddress.html#module-ipaddress) сортировать их в любом случае. Если это нужно, можно использовать эту функцию как аргумент `key` для [`sorted()`](https://python-all.ru/3.5/library/functions.html#sorted).667668*obj* – это объект сети или адреса.669670## 21.28.6. Пользовательские исключения671672Для поддержки более конкретных сообщений об ошибках от конструкторов классов модуль определяет следующие исключения:673674#### `exception ipaddress.AddressValueError(ValueError)`675676Любая ошибка значения, связанная с адресом.677678#### `exception ipaddress.NetmaskValueError(ValueError)`679680Любая ошибка значения, связанная с маской подсети.681