ipaddress.md
1> **Источник:** https://python-all.ru/3.16/library/ipaddress.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `ipaddress` – библиотека для работы с IPv4/IPv689**Исходный код:** [Lib/ipaddress.py](https://python-all.ru/src/main/Lib/ipaddress.py)1011---1213`ipaddress` предоставляет возможности для создания, изменения и работы с IPv4- и IPv6-адресами и сетями.1415Функции и классы этого модуля упрощают выполнение различных задач, связанных с IP-адресами: проверку, находятся ли два хоста в одной подсети; перебор всех хостов в заданной подсети; проверку, является ли строка корректным IP-адресом или определением сети, и так далее.1617Это полная справочная информация по модулю API. Обзор и введение см. в [Введение в модуль ipaddress](https://python-all.ru/3.16/howto/ipaddress.html#ipaddress-howto).1819Добавлено в версии 3.3.2021## Удобные фабричные функции2223Модуль `ipaddress` предоставляет фабричные функции для удобного создания IP-адресов, сетей и интерфейсов:2425#### `ipaddress.ip_address(address)`2627Возвращает объект [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address) или [`IPv6Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address) в зависимости от переданного IP-адреса. Можно передавать как IPv4-, так и IPv6-адреса; целые числа меньше `2**32` по умолчанию считаются IPv4. Если *address* не является корректным IPv4- или IPv6-адресом, возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).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.16/library/ipaddress.html#ipaddress.IPv4Network) или [`IPv6Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Network) в зависимости от переданного IP-адреса. *address* – строка или целое число, представляющее IP-сеть. Можно передавать как IPv4-, так и IPv6-сети; целые числа меньше `2**32` по умолчанию считаются IPv4. Параметр *strict* передаётся конструктору `IPv4Network` или `IPv6Network`. Если *address* не является корректным IPv4- или IPv6-адресом, или в сети установлены биты хоста, возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).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.16/library/ipaddress.html#ipaddress.IPv4Interface) или [`IPv6Interface`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Interface) в зависимости от переданного IP-адреса. *address* – строка или целое число, представляющее IP-адрес. Можно передавать как IPv4-, так и IPv6-адреса; целые числа меньше `2**32` по умолчанию считаются IPv4. Если *address* не является корректным IPv4- или IPv6-адресом, возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError).4849Недостаток этих удобных функций в том, что необходимость поддержки обоих форматов – IPv4 и IPv6 – приводит к тому, что сообщения об ошибках содержат минимум информации о точной ошибке, поскольку функции не знают, какой формат предполагался. Более подробные сообщения об ошибках можно получить, напрямую вызывая соответствующие версии конструкторов классов.5051## IP-адреса5253### Объекты адресов5455Объекты [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address) и [`IPv6Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address) имеют много общих атрибутов. Некоторые атрибуты, имеющие смысл только для IPv6-адресов, также реализованы в объектах `IPv4Address`, чтобы упростить написание кода, корректно работающего с обеими версиями IP. Объекты адресов являются [хешируемыми](https://python-all.ru/3.16/glossary.html#term-hashable), поэтому их можно использовать в качестве ключей словаря.5657#### `class ipaddress.IPv4Address(address)`5859Создаёт IPv4-адрес. Если *address* не является корректным IPv4-адресом, возбуждается [`AddressValueError`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.AddressValueError).6061Корректным IPv4-адресом считается следующее:62631. Строка в десятично-точечной нотации, состоящая из четырёх десятичных целых чисел в диапазоне от 0 до 255 включительно, разделённых точками (например, `192.168.0.1`). Каждое целое число представляет октет (байт) адреса. Начальные нули не допускаются, чтобы избежать путаницы с восьмеричной записью.642. Целое число, помещающееся в 32 бита.653. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.16/library/stdtypes.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Изменено в версии 3.8: Начальные нули теперь допускаются, даже в неоднозначных случаях, похожих на восьмеричную запись.7778Изменено в версии 3.9.5: Начальные нули больше не допускаются и считаются ошибкой. Строки IPv4-адресов теперь разбираются так же строго, как в glibc [`inet_pton()`](https://python-all.ru/3.16/library/socket.html#socket.inet_pton).7980#### `version`8182Соответствующий номер версии: `4` для IPv4, `6` для IPv6.8384Изменено в версии 3.14: Стало доступно для класса.8586#### `max_prefixlen`8788Общее количество бит в представлении адреса для данной версии: `32` для IPv4, `128` для IPv6.8990Префикс определяет количество старших бит в адресе, которые сравниваются, чтобы определить, принадлежит ли адрес сети.9192Изменено в версии 3.14: Стало доступно для класса.9394#### `compressed`9596#### `exploded`9798Строковое представление в десятичной записи с точками. Начальные нули никогда не включаются в представление.99100Поскольку IPv4 не определяет сокращённой записи для адресов, в которых октеты равны нулю, эти два атрибута всегда совпадают с `str(addr)` для IPv4-адресов. Наличие этих атрибутов упрощает написание кода отображения, способного работать как с IPv4-, так и с IPv6-адресами.101102#### `packed`103104Двоичное представление этого адреса – объект [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) соответствующей длины (сначала старший октет). Это 4 байта для IPv4 и 16 байт для IPv6.105106#### `reverse_pointer`107108Имя обратной PTR-записи DNS для IP-адреса, например:109110```python111>>> ipaddress.ip_address("127.0.0.1").reverse_pointer112'1.0.0.127.in-addr.arpa'113>>> ipaddress.ip_address("2001:db8::1").reverse_pointer114'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'115```116117Это имя, которое можно использовать для выполнения PTR-запроса, а не разрешённое имя узла.118119Добавлено в версии 3.5.120121#### `is_multicast`122123`True`, если адрес зарезервирован для многоадресной рассылки. См. [**RFC 3171**](https://python-all.ru/3.16/library/ipaddress.html) (для IPv4) или [**RFC 2373**](https://python-all.ru/3.16/library/ipaddress.html) (для IPv6).124125#### `is_private`126127`True`, если адрес определён как глобально недостижимый согласно [iana-ipv4-special-registry](https://python-all.ru/3.16/library/ipaddress.html) (для IPv4) или [iana-ipv6-special-registry](https://python-all.ru/3.16/library/ipaddress.html) (для IPv6), за следующими исключениями:128129- `is_private` равно `False` для общего адресного пространства (`100.64.0.0/10`)130- Для IPv4-отображённых IPv6-адресов значение `is_private` определяется семантикой базовых IPv4-адресов, и выполняется следующее условие (см. [`IPv6Address.ipv4_mapped`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address.ipv4_mapped)):131132 ```python133 address.is_private == address.ipv4_mapped.is_private134 ```135136`is_private` имеет значение, противоположное [`is_global`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address.is_global), за исключением общего адресного пространства (диапазон `100.64.0.0/10`), где оба равны `False`.137138Изменено в версии 3.13: Исправлены некоторые ложные срабатывания и пропуски.139140- `192.0.0.0/24` считается частным, за исключением `192.0.0.9/32` и `192.0.0.10/32` (ранее: только поддиапазон `192.0.0.0/29` считался частным).141- `64:ff9b:1::/48` считается частным.142- `2002::/16` считается частным.143- Внутри `2001::/23` (в остальном считающегося частным) есть исключения: `2001:1::1/128`, `2001:1::2/128`, `2001:3::/32`, `2001:4:112::/48`, `2001:20::/28`, `2001:30::/28`. Исключения не считаются частными.144145#### `is_global`146147`True`, если адрес определён как глобально достижимый согласно [iana-ipv4-special-registry](https://python-all.ru/3.16/library/ipaddress.html) (для IPv4) или [iana-ipv6-special-registry](https://python-all.ru/3.16/library/ipaddress.html) (для IPv6), за следующим исключением:148149Для IPv4-отображённых IPv6-адресов значение `is_private` определяется семантикой базовых IPv4-адресов, и выполняется следующее условие (см. [`IPv6Address.ipv4_mapped`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address.ipv4_mapped)):150151```python152address.is_global == address.ipv4_mapped.is_global153```154155`is_global` имеет значение, противоположное [`is_private`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address.is_private), за исключением общего адресного пространства (диапазон `100.64.0.0/10`), где оба равны `False`.156157Добавлено в версии 3.4.158159Изменено в версии 3.13: Исправлены некоторые ложные срабатывания и пропуски, подробнее см. [`is_private`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address.is_private).160161#### `is_unspecified`162163`True`, если адрес не определён. См. [**RFC 5735**](https://python-all.ru/3.16/library/ipaddress.html) (для IPv4) или [**RFC 2373**](https://python-all.ru/3.16/library/ipaddress.html) (для IPv6).164165#### `is_reserved`166167`True`, если адрес отмечен IETF как зарезервированный. Для IPv4 это только `240.0.0.0/4`, блок адресов `Reserved`. Для IPv6 это все адреса, [выделенные](https://python-all.ru/3.16/library/ipaddress.html) как `Reserved by IETF` для будущего использования.168169> **Примечание**170>171> Для IPv4 `is_reserved` не связан со значением блока адресов из столбца `Reserved-by-Protocol` в [iana-ipv4-special-registry](https://python-all.ru/3.16/library/ipaddress.html).172173> **Внимание**174>175> For IPv6, `fec0::/10` a former Site-Local scoped address prefix is currently excluded from that list (see [`is_site_local`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address.is_site_local) & [**RFC 3879**](https://python-all.ru/3.16/library/ipaddress.html)).176177#### `is_loopback`178179`True`, если это адрес loopback. См. [**RFC 3330**](https://python-all.ru/3.16/library/ipaddress.html) (для IPv4) или [**RFC 2373**](https://python-all.ru/3.16/library/ipaddress.html) (для IPv6).180181#### `is_link_local`182183`True`, если адрес зарезервирован для использования в link-local. См. [**RFC 3927**](https://python-all.ru/3.16/library/ipaddress.html).184185#### `ipv6_mapped`186187`IPv4Address` объект, представляющий IPv4-отображённый IPv6-адрес. См. [**RFC 4291**](https://python-all.ru/3.16/library/ipaddress.html).188189Добавлено в версии 3.13.190191#### `IPv4Address.__format__(fmt)`192193Возвращает строковое представление IP-адреса, управляемое явной строкой формата. *fmt* может быть одним из следующих: `'s'`, вариант по умолчанию, эквивалентный [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str); `'b'` для двоичной строки с нулевым заполнением; `'X'` или `'x'` для шестнадцатеричного представления в верхнем или нижнем регистре; или `'n'`, который эквивалентен `'b'` для IPv4-адресов и `'x'` для IPv6. Для двоичного и шестнадцатеричного представления доступны спецификатор формы `'#'` и опция группировки `'_'`. `__format__` используется `format`, `str.format` и f-строками.194195```python196>>> format(ipaddress.IPv4Address('192.168.0.1'))197'192.168.0.1'198>>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1'))199'0b11000000101010000000000000000001'200>>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}'201'2001:db8::1000'202>>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X')203'2001_0DB8_0000_0000_0000_0000_0000_1000'204>>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000'))205'0x2001_0db8_0000_0000_0000_0000_0000_1000'206```207208Добавлено в версии 3.9.209210#### `class ipaddress.IPv6Address(address)`211212Создаёт IPv6-адрес. [`AddressValueError`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.AddressValueError) возникает, если *address* не является допустимым IPv6-адресом.213214Допустимый IPv6-адрес образуется следующим образом:2152161. Строка из восьми групп по четыре шестнадцатеричных цифры, каждая группа представляет 16 бит. Группы разделяются двоеточиями. Это описывает *развёрнутую* (полную) запись. Строка также может быть *сжата* (краткая запись) различными способами. Подробнее см. [**RFC 4291**](https://python-all.ru/3.16/library/ipaddress.html). Например, `"0000:0000:0000:0000:0000:0abc:0007:0def"` можно сжать до `"::abc:7:def"`.217218 Строка может также дополнительно содержать идентификатор зоны области действия (scope zone ID), выраженный суффиксом `%scope_id`. При наличии такой идентификатор зоны должен быть непустым и не может содержать `%`. Подробнее см. [**RFC 4007**](https://python-all.ru/3.16/library/ipaddress.html). Например, `fe80::1234%1` может идентифицировать адрес `fe80::1234` на первом канале (link) узла.2192. Целое число, помещающееся в 128 бит.2203. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) длиной 16, big-endian.221222```python223>>> ipaddress.IPv6Address('2001:db8::1000')224IPv6Address('2001:db8::1000')225>>> ipaddress.IPv6Address('ff02::5678%1')226IPv6Address('ff02::5678%1')227```228229#### `compressed`230231Краткая форма представления адреса, в которой опущены ведущие нули в группах, а самая длинная последовательность групп, состоящих полностью из нулей, сжата в одну пустую группу.232233Это также значение, возвращаемое `str(addr)` для IPv6-адресов.234235#### `exploded`236237Полная форма представления адреса, включающая все ведущие нули и группы, состоящие полностью из нулей.238239Для следующих атрибутов и методов см. соответствующую документацию класса [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address):240241#### `packed`242243#### `reverse_pointer`244245#### `version`246247#### `max_prefixlen`248249#### `is_multicast`250251#### `is_private`252253#### `is_global`254255Добавлено в версии 3.4.256257#### `is_unspecified`258259#### `is_reserved`260261#### `is_loopback`262263#### `is_link_local`264265#### `is_site_local`266267`True` если адрес зарезервирован для использования в локальной сети (site-local). Обратите внимание, что пространство адресов site-local признано устаревшим согласно [**RFC 3879**](https://python-all.ru/3.16/library/ipaddress.html). Используйте [`is_private`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address.is_private) для проверки, принадлежит ли этот адрес пространству уникальных локальных адресов, определённому в [**RFC 4193**](https://python-all.ru/3.16/library/ipaddress.html).268269#### `ipv4_mapped`270271Для адресов, которые выглядят как отображённые адресы IPv4 в диапазоне `::FFFF:0:0/96`, определённом в [**RFC 4291**](https://python-all.ru/3.16/library/ipaddress.html), это свойство возвращает встроенный IPv4-адрес. Для любого другого адреса это свойство будет `None`.272273#### `scope_id`274275Для адресов с областью действия (scoped addresses), определённых в [**RFC 4007**](https://python-all.ru/3.16/library/ipaddress.html), это свойство определяет конкретную зону области действия адреса, к которой принадлежит адрес, в виде строки. Если зона области действия не указана, это свойство будет `None`.276277#### `sixtofour`278279Для адресов, которые выглядят как адреса 6to4 (начинающиеся с `2002::/16`), определённые в [**RFC 3056**](https://python-all.ru/3.16/library/ipaddress.html), это свойство возвращает встроенный IPv4-адрес. Для любого другого адреса это свойство будет `None`.280281#### `teredo`282283Для адресов, которые выглядят как адреса Teredo (начинающиеся с `2001::/32`), определённые в [**RFC 4380**](https://python-all.ru/3.16/library/ipaddress.html), это свойство возвращает встроенную пару `(server, client)` IP-адресов. Для любого другого адреса это свойство будет `None`.284285#### `IPv6Address.__format__(fmt)`286287Обратитесь к соответствующей документации метода в [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address).288289Добавлено в версии 3.9.290291### Преобразование в строки и целые числа292293Для взаимодействия с сетевыми интерфейсами, такими как модуль socket, адреса должны быть преобразованы в строки или целые числа. Это делается с помощью встроенных функций [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str) и [`int()`](https://python-all.ru/3.16/library/functions.html#int):294295```python296>>> str(ipaddress.IPv4Address('192.168.0.1'))297'192.168.0.1'298>>> int(ipaddress.IPv4Address('192.168.0.1'))2993232235521300>>> str(ipaddress.IPv6Address('::1'))301'::1'302>>> int(ipaddress.IPv6Address('::1'))3031304```305306Обратите внимание, что IPv6-адреса с областью действия (scoped addresses) преобразуются в целые числа без идентификатора зоны области действия.307308### Операторы309310Объекты адресов поддерживают некоторые операторы. Если не указано иное, операторы могут применяться только между совместимыми объектами (т.е. IPv4 с IPv4, IPv6 с IPv6).311312#### Операторы сравнения313314Объекты адресов можно сравнивать с помощью обычного набора операторов сравнения. Одинаковые IPv6-адреса с разными идентификаторами зоны области действия не равны. Несколько примеров:315316```python317>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')318True319>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')320False321>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')322True323>>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1')324False325>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')326True327```328329#### Арифметические операторы330331Целые числа можно прибавлять к объектам адресов или вычитать из них. Несколько примеров:332333```python334>>> IPv4Address('127.0.0.2') + 3335IPv4Address('127.0.0.5')336>>> IPv4Address('127.0.0.2') - 3337IPv4Address('126.255.255.255')338>>> IPv4Address('255.255.255.255') + 1339Traceback (most recent call last):340 File "<stdin>", line 1, in <module>341ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address342```343344## Определения IP-сетей345346Объекты [`IPv4Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Network) и [`IPv6Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Network) предоставляют механизм для определения и изучения определений IP-сетей. Определение сети состоит из *маски* и *сетевого адреса* и, таким образом, определяет диапазон IP-адресов, которые равны сетевому адресу при наложении маски (побитовое И) с маской. Например, определение сети с маской `255.255.255.0` и сетевым адресом `192.168.1.0` включает IP-адреса в диапазоне от `192.168.1.0` до `192.168.1.255` включительно.347348### Префикс, маска сети и маска хоста349350Существует несколько эквивалентных способов указания масок IP-сетей. *Префикс* `/<nbits>` – это обозначение, показывающее, сколько старших битов установлено в маске сети. *Маска сети* – это IP-адрес, в котором установлено некоторое количество старших битов. Таким образом, префикс `/24` эквивалентен маске сети `255.255.255.0` в IPv4 или `ffff:ff00::` в IPv6. Кроме того, *маска хоста* является логическим отрицанием *маски сети* и иногда используется (например, в списках управления доступом Cisco) для обозначения маски сети. Маска хоста, эквивалентная `/24` в IPv4, – это `0.0.0.255`.351352### Объекты сетей353354Все атрибуты, реализованные объектами адресов, также реализованы объектами сетей. Кроме того, объекты сетей реализуют дополнительные атрибуты. Все они являются общими для [`IPv4Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Network) и [`IPv6Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Network), поэтому во избежание дублирования они задокументированы только для `IPv4Network`. Объекты сетей являются [хешируемыми](https://python-all.ru/3.16/glossary.html#term-hashable), поэтому их можно использовать в качестве ключей в словарях.355356#### `class ipaddress.IPv4Network(address, strict=True)`357358Создаёт определение IPv4-сети. *адрес* может быть одним из следующих:3593601. Строка, состоящая из IP-адреса и необязательной маски, разделённых косой чертой (`/`). IP-адрес является сетевым адресом, а маска может быть либо числом, что означает *префикс*, либо строковым представлением IPv4-адреса. Если маска указана в виде строки, она интерпретируется как *маска сети*, если начинается с ненулевого поля, или как *маска хоста*, если начинается с нулевого поля, за единственным исключением: все нулевая маска обрабатывается как *маска сети*. Если маска не указана, считается равной `/32`.361362 Например, следующие спецификации *адрес* эквивалентны: `192.168.1.0/24`, `192.168.1.0/255.255.255.0` и `192.168.1.0/0.0.0.255`.3632. Целое число, помещающееся в 32 бита. Оно эквивалентно сети с одним адресом, где адресом сети является *address*, а маской – `/32`.3643. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) длиной 4 байта, с порядком от старшего к младшему. Интерпретация аналогична целочисленному *адресу*.3654. Кортеж из двух элементов: описания адреса и маски сети. Описание адреса может быть строкой, 32-битным целым, упакованным 4-байтовым целым или существующим объектом [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address). Маска сети может быть целым числом, представляющим длину префикса (например, `24`), или строкой, представляющей маску префикса (например, `255.255.255.0`).366367Исключение [`AddressValueError`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.AddressValueError) возбуждается, если *адрес* не является допустимым IPv4-адресом. Исключение [`NetmaskValueError`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.NetmaskValueError) возбуждается, если маска недопустима для IPv4-адреса.368369Если *strict* равен `True` и в предоставленном адресе установлены биты хоста, вызывается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.370371Если не указано иное, все методы сетей, принимающие другие объекты сетей/адресов, возбуждают [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), если версия IP аргумента несовместима с `self`.372373Изменено в версии 3.5: Добавлена двухэлементная форма для параметра конструктора *address*.374375#### `version`376377#### `max_prefixlen`378379Обратитесь к соответствующей документации атрибутов в [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address).380381#### `is_multicast`382383#### `is_private`384385#### `is_unspecified`386387#### `is_reserved`388389#### `is_loopback`390391#### `is_link_local`392393Эти атрибуты истинны для всей сети, если они истинны как для сетевого адреса, так и для широковещательного адреса.394395#### `network_address`396397Сетевой адрес для этой сети. Сетевой адрес и длина префикса вместе однозначно определяют сеть.398399#### `broadcast_address`400401Широковещательный адрес для этой сети. Пакеты, отправленные на широковещательный адрес, должны быть получены каждым хостом в сети.402403#### `hostmask`404405Маска хоста в виде объекта [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address).406407#### `netmask`408409Маска сети в виде объекта [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address).410411#### `with_prefixlen`412413#### `compressed`414415#### `exploded`416417Строковое представление сети с маской в префиксной нотации.418419`with_prefixlen` и `compressed` всегда совпадают с `str(network)`. `exploded` использует развёрнутую форму сетевого адреса.420421#### `with_netmask`422423Строковое представление сети с маской в нотации маски сети.424425#### `with_hostmask`426427Строковое представление сети с маской в нотации хостовой маски.428429#### `num_addresses`430431Общее количество адресов в сети.432433#### `prefixlen`434435Длина префикса сети в битах.436437#### `hosts()`438439Возвращает итератор по доступным хостам в сети. Доступные хосты – это все IP-адреса, принадлежащие сети, кроме самого сетевого адреса и широковещательного адреса сети. Для сетей с длиной маски 31 сетевой адрес и широковещательный адрес также включаются в результат. Сети с маской 32 вернут список, содержащий единственный адрес хоста.440441```python442>>> list(ip_network('192.0.2.0/29').hosts())443[IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),444 IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),445 IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]446>>> list(ip_network('192.0.2.0/31').hosts())447[IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]448>>> list(ip_network('192.0.2.1/32').hosts())449[IPv4Address('192.0.2.1')]450```451452#### `overlaps(other)`453454`True`, если данная сеть частично или полностью содержится в *другом* или *другой* полностью содержится в данной сети.455456#### `address_exclude(network)`457458Вычисляет определения сети, получающиеся при удалении указанной *сети* из данной. Возвращает итератор объектов сети. Вызывает [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), если *сеть* не полностью содержится в данной сети.459460```python461>>> n1 = ip_network('192.0.2.0/28')462>>> n2 = ip_network('192.0.2.1/32')463>>> list(n1.address_exclude(n2))464[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),465 IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]466```467468#### `subnets(prefixlen_diff=1, new_prefix=None)`469470Подсети, объединение которых образует текущее определение сети, в зависимости от значений аргументов. *prefixlen\_diff* – это величина, на которую должна быть увеличена длина нашего префикса. *new\_prefix* – это желаемый новый префикс подсетей; он должен быть больше нашего префикса. Должен быть задан ровно один из *prefixlen\_diff* и *new\_prefix*. Возвращает итератор объектов сети.471472```python473>>> list(ip_network('192.0.2.0/24').subnets())474[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]475>>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))476[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),477 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]478>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26))479[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),480 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]481>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))482Traceback (most recent call last):483 File "<stdin>", line 1, in <module>484 raise ValueError('new prefix must be longer')485ValueError: new prefix must be longer486>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))487[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]488```489490#### `supernet(prefixlen_diff=1, new_prefix=None)`491492Суперсеть, содержащая данное определение сети, в зависимости от значений аргументов. *prefixlen\_diff* – это величина, на которую должна быть уменьшена длина нашего префикса. *new\_prefix* – это желаемый новый префикс суперсети; он должен быть меньше нашего префикса. Должен быть задан ровно один из *prefixlen\_diff* и *new\_prefix*. Возвращает один объект сети.493494```python495>>> ip_network('192.0.2.0/24').supernet()496IPv4Network('192.0.2.0/23')497>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)498IPv4Network('192.0.0.0/22')499>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)500IPv4Network('192.0.0.0/20')501```502503#### `subnet_of(other)`504505Возвращает `True`, если данная сеть является подсетью *другого*.506507```python508>>> a = ip_network('192.168.1.0/24')509>>> b = ip_network('192.168.1.128/30')510>>> b.subnet_of(a)511True512```513514Добавлено в версии 3.7.515516#### `supernet_of(other)`517518Возвращает `True`, если данная сеть является суперсетью *другого*.519520```python521>>> a = ip_network('192.168.1.0/24')522>>> b = ip_network('192.168.1.128/30')523>>> a.supernet_of(b)524True525```526527Добавлено в версии 3.7.528529#### `compare_networks(other)`530531Сравнивает данную сеть с *другим*. При таком сравнении учитываются только сетевые адреса; биты хоста не учитываются. Возвращает `-1`, `0` или `1`.532533```python534>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))535-1536>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))5371538>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))5390540```541542Устарело с версии 3.7: Использует тот же алгоритм упорядочивания и сравнения, что и “\<”, “==”, и “\>”543544#### `class ipaddress.IPv6Network(address, strict=True)`545546Создаёт определение IPv6-сети. *адрес* может быть одним из следующих:5475481. Строка, состоящая из IP-адреса и необязательной длины префикса, разделённых косой чертой (`/`). IP-адрес является сетевым адресом, а длина префикса должна быть одним числом – *префикс*. Если длина префикса не указана, считается равной `/128`.549550 Обратите внимание, что расширенные сетевые маски в настоящее время не поддерживаются. Это означает, что `2001:db00::0/24` является допустимым аргументом, а `2001:db00::0/ffff:ff00::` – нет.5512. Целое число, помещающееся в 128 бит. Это эквивалентно сети с одним адресом, где сетевым адресом является *адрес*, а маской – `/128`.5523. Целое число, упакованное в объект [`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes) длиной 16 байт, порядок байтов от старшего к младшему. Интерпретация аналогична целому числу *адрес*.5534. Кортеж из двух элементов: описание адреса и сетевая маска. Описание адреса может быть строкой, 128-битным целым числом, 16-байтным упакованным целым числом или существующим объектом [`IPv6Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address); сетевая маска – это целое число, представляющее длину префикса.554555[`AddressValueError`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.AddressValueError) вызывается, если *адрес* не является допустимым IPv6-адресом. [`NetmaskValueError`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.NetmaskValueError) вызывается, если маска недопустима для IPv6-адреса.556557Если *strict* равен `True` и в предоставленном адресе установлены биты хоста, вызывается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). В противном случае биты хоста маскируются для определения соответствующего сетевого адреса.558559Изменено в версии 3.5: Добавлена двухэлементная форма для параметра конструктора *address*.560561#### `version`562563#### `max_prefixlen`564565#### `is_multicast`566567#### `is_private`568569#### `is_unspecified`570571#### `is_reserved`572573#### `is_loopback`574575#### `is_link_local`576577#### `network_address`578579#### `broadcast_address`580581#### `hostmask`582583#### `netmask`584585#### `with_prefixlen`586587#### `compressed`588589#### `exploded`590591#### `with_netmask`592593#### `with_hostmask`594595#### `num_addresses`596597#### `prefixlen`598599#### `hosts()`600601Возвращает итератор по используемым хостам в сети. Используемые хосты – это все IP-адреса, принадлежащие сети, за исключением anycast-адреса подсети-маршрутизатора. Для сетей с длиной маски 127 anycast-адрес подсети-маршрутизатора также включается в результат. Сети с маской 128 вернут список, содержащий единственный адрес хоста.602603#### `overlaps(other)`604605#### `address_exclude(network)`606607#### `subnets(prefixlen_diff=1, new_prefix=None)`608609#### `supernet(prefixlen_diff=1, new_prefix=None)`610611#### `subnet_of(other)`612613#### `supernet_of(other)`614615#### `compare_networks(other)`616617Обратитесь к соответствующей документации атрибутов в [`IPv4Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Network).618619#### `is_site_local`620621Этот атрибут истинен для всей сети, если он истинен как для сетевого адреса, так и для широковещательного адреса.622623### Операторы624625Сетевые объекты поддерживают некоторые операторы. Если не указано иное, операторы можно применять только между совместимыми объектами (например, IPv4 с IPv4, IPv6 с IPv6).626627#### Логические операторы628629Сетевые объекты можно сравнивать с помощью обычного набора логических операторов. Сетевые объекты упорядочиваются сначала по сетевому адресу, затем по маске сети.630631#### Перебор632633Сетевые объекты можно перебирать для получения списка всех адресов, принадлежащих сети. При переборе возвращаются *все* хосты, включая непригодные для использования (для пригодных хостов используйте метод [`hosts()`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Network.hosts)). Пример:634635```python636>>> for addr in IPv4Network('192.0.2.0/28'):637... addr638...639IPv4Address('192.0.2.0')640IPv4Address('192.0.2.1')641IPv4Address('192.0.2.2')642IPv4Address('192.0.2.3')643IPv4Address('192.0.2.4')644IPv4Address('192.0.2.5')645IPv4Address('192.0.2.6')646IPv4Address('192.0.2.7')647IPv4Address('192.0.2.8')648IPv4Address('192.0.2.9')649IPv4Address('192.0.2.10')650IPv4Address('192.0.2.11')651IPv4Address('192.0.2.12')652IPv4Address('192.0.2.13')653IPv4Address('192.0.2.14')654IPv4Address('192.0.2.15')655```656657#### Сети как контейнеры адресов658659Сетевые объекты могут выступать в качестве контейнеров адресов. Несколько примеров:660661```python662>>> IPv4Network('192.0.2.0/28')[0]663IPv4Address('192.0.2.0')664>>> IPv4Network('192.0.2.0/28')[15]665IPv4Address('192.0.2.15')666>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')667True668>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')669False670```671672## Объекты интерфейсов673674Объекты интерфейсов [хешируемы](https://python-all.ru/3.16/glossary.html#term-hashable), поэтому их можно использовать в качестве ключей в словарях.675676#### `class ipaddress.IPv4Interface(address)`677678Создаёт интерфейс IPv4. Значение *address* такое же, как в конструкторе [`IPv4Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Network), за исключением того, что произвольные адреса хостов всегда принимаются.679680`IPv4Interface` является подклассом [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address), поэтому наследует все атрибуты этого класса. Кроме того, доступны следующие атрибуты:681682#### `ip`683684Адрес ([`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address)) без информации о сети.685686```python687>>> interface = IPv4Interface('192.0.2.5/24')688>>> interface.ip689IPv4Address('192.0.2.5')690```691692#### `network`693694Сеть ([`IPv4Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Network)), к которой принадлежит данный интерфейс.695696```python697>>> interface = IPv4Interface('192.0.2.5/24')698>>> interface.network699IPv4Network('192.0.2.0/24')700```701702#### `with_prefixlen`703704Строковое представление интерфейса с маской в префиксной нотации.705706```python707>>> interface = IPv4Interface('192.0.2.5/24')708>>> interface.with_prefixlen709'192.0.2.5/24'710```711712#### `with_netmask`713714Строковое представление интерфейса, где сеть указана в виде маски сети.715716```python717>>> interface = IPv4Interface('192.0.2.5/24')718>>> interface.with_netmask719'192.0.2.5/255.255.255.0'720```721722#### `with_hostmask`723724Строковое представление интерфейса, где сеть указана в виде маски хоста.725726```python727>>> interface = IPv4Interface('192.0.2.5/24')728>>> interface.with_hostmask729'192.0.2.5/0.0.0.255'730```731732#### `class ipaddress.IPv6Interface(address)`733734Создаёт интерфейс IPv6. Значение *address* такое же, как в конструкторе [`IPv6Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Network), за исключением того, что произвольные адреса хостов всегда принимаются.735736`IPv6Interface` является подклассом [`IPv6Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address), поэтому наследует все атрибуты этого класса. Кроме того, доступны следующие атрибуты:737738#### `ip`739740#### `network`741742#### `with_prefixlen`743744#### `with_netmask`745746#### `with_hostmask`747748Обратитесь к соответствующей документации атрибутов в [`IPv4Interface`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Interface).749750### Операторы751752Объекты интерфейса поддерживают некоторые операторы. Если не указано иное, операторы можно применять только между совместимыми объектами (т.е. IPv4 с IPv4, IPv6 с IPv6).753754#### Логические операторы755756Объекты интерфейса можно сравнивать с помощью обычного набора логических операторов.757758Для сравнения на равенство (`==` и `!=`) и IP-адрес, и сеть должны совпадать, чтобы объекты были равны. Интерфейс не будет равен ни одному адресу или сетевому объекту.759760Для упорядочивания (`<`, `>` и т.д.) действуют другие правила. Интерфейсные объекты и объекты адресов одной версии IP можно сравнивать, при этом объекты адресов всегда будут сортироваться перед интерфейсными объектами. Два интерфейсных объекта сначала сравниваются по своим сетям, а если они одинаковы, то по своим IP-адресам.761762## Другие функции уровня модуля763764Модуль также предоставляет следующие функции уровня модуля:765766#### `ipaddress.v4_int_to_packed(address)`767768Представляет адрес в виде 4 упакованных байт в сетевом порядке (big-endian). *address* – это целочисленное представление IPv4-адреса. Исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) возбуждается, если целое отрицательно или слишком велико для IPv4-адреса.769770```python771>>> ipaddress.ip_address(3221225985)772IPv4Address('192.0.2.1')773>>> ipaddress.v4_int_to_packed(3221225985)774b'\xc0\x00\x02\x01'775```776777#### `ipaddress.v6_int_to_packed(address)`778779Представляет адрес в виде 16 упакованных байт в сетевом порядке (big-endian). *address* – это целочисленное представление IPv6-адреса. Исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) возбуждается, если целое отрицательно или слишком велико для IPv6-адреса.780781#### `ipaddress.summarize_address_range(first, last)`782783Возвращает итератор суммарного диапазона сети, заданного первым и последним IP-адресами. *first* – это первый [`IPv4Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Address) или [`IPv6Address`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Address) в диапазоне, а *last* – это последний `IPv4Address` или `IPv6Address` в диапазоне. Исключение [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError) возбуждается, если *first* или *last* не являются IP-адресами или имеют разные версии. Исключение [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) возбуждается, если *last* не больше *first*, или если версия адреса *first* не равна 4 или 6.784785```python786>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(787... ipaddress.IPv4Address('192.0.2.0'),788... ipaddress.IPv4Address('192.0.2.130'))]789[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]790```791792#### `ipaddress.collapse_addresses(addresses)`793794Возвращает итератор свернутых объектов [`IPv4Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv4Network) или [`IPv6Network`](https://python-all.ru/3.16/library/ipaddress.html#ipaddress.IPv6Network). *addresses* – это [итерируемый объект](https://python-all.ru/3.16/glossary.html#term-iterable), состоящий из объектов `IPv4Network` или `IPv6Network`. Исключение [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError) возбуждается, если *addresses* содержит объекты смешанных версий.795796```python797>>> [ipaddr for ipaddr in798... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),799... ipaddress.IPv4Network('192.0.2.128/25')])]800[IPv4Network('192.0.2.0/24')]801```802803#### `ipaddress.get_mixed_type_key(obj)`804805Возвращает ключ, подходящий для сортировки сетей и адресов. Объекты Address и Network по умолчанию не сортируются; они принципиально разные, поэтому выражение:806807```python808IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')809```810811не имеет смысла. Однако иногда может потребоваться, чтобы `ipaddress` всё же сортировал их. Если это необходимо, можно использовать эту функцию в качестве аргумента *key* для [`sorted()`](https://python-all.ru/3.16/library/functions.html#sorted).812813*obj* – это объект сети или адреса.814815## Пользовательские исключения816817Для поддержки более конкретных сообщений об ошибках от конструкторов классов модуль определяет следующие исключения:818819#### `exception ipaddress.AddressValueError(ValueError)`820821Любая ошибка значения, связанная с адресом.822823#### `exception ipaddress.NetmaskValueError(ValueError)`824825Любая ошибка значения, связанная с маской сети.826