ipaddress — IPv4/IPv6 操作庫

原始碼: Lib/ipaddress.py


ipaddress 提供了建立、操作和處理 IPv4 和 IPv6 地址和網路的功能。

此模組中的函式和類使得處理與 IP 地址相關的各種任務變得簡單,包括檢查兩個主機是否在同一子網上、迭代特定子網中的所有主機、檢查字串是否表示有效的 IP 地址或網路定義,等等。

這是完整的模組 API 參考—有關概述和介紹,請參見ipaddress 模組簡介

在 3.3 版本中新增。

便捷工廠函式

ipaddress 模組提供了便捷的工廠函式來建立 IP 地址、網路和介面。

ipaddress.ip_address(address)

返回一個 IPv4AddressIPv6Address 物件,具體取決於作為引數傳遞的 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)

返回一個 IPv4NetworkIPv6Network 物件,具體取決於作為引數傳遞的 IP 地址。address 是一個表示 IP 網路的字串或整數。可以提供 IPv4 或 IPv6 網路;小於 2**32 的整數預設會被認為是 IPv4。strict 被傳遞給 IPv4NetworkIPv6Network 建構函式。如果 address 不表示有效的 IPv4 或 IPv6 地址,或者如果網路設定了主機位,則會引發 ValueError

>>> ipaddress.ip_network('192.168.0.0/28')
IPv4Network('192.168.0.0/28')
ipaddress.ip_interface(address)

返回一個 IPv4InterfaceIPv6Interface 物件,具體取決於作為引數傳遞的 IP 地址。address 是一個表示 IP 地址的字串或整數。可以提供 IPv4 或 IPv6 地址;小於 2**32 的整數預設會被認為是 IPv4。如果 address 不表示有效的 IPv4 或 IPv6 地址,則會引發 ValueError

這些便捷函式的一個缺點是,需要處理 IPv4 和 IPv6 格式,這意味著錯誤訊息提供的關於精確錯誤的資訊最少,因為這些函式不知道預期使用的是 IPv4 還是 IPv6 格式。可以透過直接呼叫相應的特定版本類建構函式來獲得更詳細的錯誤報告。

IP 地址

地址物件

IPv4AddressIPv6Address 物件共享許多共同的屬性。一些僅對 IPv6 地址有意義的屬性也由 IPv4Address 物件實現,以便更容易編寫正確處理這兩個 IP 版本的程式碼。地址物件是可雜湊的,因此它們可以用作字典中的鍵。

class ipaddress.IPv4Address(address)

構造一個 IPv4 地址。如果 address 不是有效的 IPv4 地址,則會引發 AddressValueError

以下構成有效的 IPv4 地址

  1. 一個十進位制點分表示法的字串,由四個十進位制整陣列成,範圍為 0–255(包括 0 和 255),用點分隔(例如,192.168.0.1)。每個整數表示地址中的一個八位位元組(位元組)。不容忍前導零,以防止與八進位制表示法混淆。

  2. 一個適合 32 位的整數。

  3. 一個打包到長度為 4 的 bytes 物件中的整數(最高有效八位位元組在前)。

>>> ipaddress.IPv4Address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(3232235521)
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
IPv4Address('192.168.0.1')

在 3.8 版本中更改: 容忍前導零,即使在看起來像八進位制表示法的模稜兩可的情況下也是如此。

在 3.9.5 版本中更改: 不再容忍前導零,並將其視為錯誤。現在,IPv4 地址字串的解析與 glibc inet_pton() 一樣嚴格。

version

相應的版本號:IPv4 為 4,IPv6 為 6

max_prefixlen

此版本的地址表示中的總位數:IPv4 為 32,IPv6 為 128

字首定義了地址中用於確定地址是否屬於網路的前導位數。

compressed
exploded

點分十進位制表示法中的字串表示形式。表示形式中永遠不會包含前導零。

由於 IPv4 沒有為八位位元組設定為零的地址定義簡寫表示法,因此對於 IPv4 地址,這兩個屬性始終與 str(addr) 相同。公開這些屬性可以更輕鬆地編寫可以同時處理 IPv4 和 IPv6 地址的顯示程式碼。

packed

此地址的二進位制表示形式 - 一個具有適當長度的 bytes 物件(最高有效位元組優先)。對於 IPv4,這是 4 個位元組,對於 IPv6,這是 16 個位元組。

reverse_pointer

IP 地址的反向 DNS PTR 記錄的名稱,例如

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

如果該地址被定義為 iana-ipv4-special-registry(對於 IPv4)或 iana-ipv6-special-registry(對於 IPv6)指定為非全域性可達,則為 True,但有以下例外

  • 共享地址空間(100.64.0.0/10)的 is_privateFalse

  • 對於 IPv4 對映的 IPv6 地址,is_private 值由底層 IPv4 地址的語義確定,並且滿足以下條件(請參閱 IPv6Address.ipv4_mapped

    address.is_private == address.ipv4_mapped.is_private
    

除了共享地址空間(100.64.0.0/10 範圍)它們都為 False 之外,is_private 的值與 is_global 相反。

在 3.13 版本中更改: 修復了一些誤報和漏報。

  • 192.0.0.0/24 被認為是私有的,但 192.0.0.9/32192.0.0.10/32 除外(以前:只有 192.0.0.0/29 子範圍被認為是私有的)。

  • 64:ff9b:1::/48 被認為是私有的。

  • 2002::/16 被認為是私有的。

  • 2001::/23 中存在例外(否則被認為是私有的):2001:1::1/1282001:1::2/1282001:3::/322001:4:112::/482001:20::/282001:30::/28。這些例外不被認為是私有的。

is_global

如果該地址被 iana-ipv4-special-registry(對於 IPv4)或 iana-ipv6-special-registry(對於 IPv6)定義為全域性可達,則為 True,但有以下例外

對於 IPv4 對映的 IPv6 地址,is_private 值由底層 IPv4 地址的語義確定,並且滿足以下條件(請參閱 IPv6Address.ipv4_mapped

address.is_global == address.ipv4_mapped.is_global

除了共享地址空間(100.64.0.0/10 範圍)它們都為 False 之外,is_global 的值與 is_private 相反。

在 3.4 版本中新增。

在 3.13 版本中更改: 修復了一些誤報和漏報,詳情請參閱 is_private

is_unspecified

如果該地址未指定,則為 True。請參閱 RFC 5735 (對於 IPv4) 或 RFC 2373 (對於 IPv6)。

is_reserved

如果該地址是 IETF 保留的,則為 True

is_loopback

如果這是一個環回地址,則為 True。請參閱 RFC 3330 (對於 IPv4) 或 RFC 2373 (對於 IPv6)。

如果該地址保留用於鏈路本地使用,則為 True。請參閱 RFC 3927

ipv6_mapped

表示 IPv4 對映的 IPv6 地址的 IPv4Address 物件。請參閱 RFC 4291

在 3.13 版本中新增。

IPv4Address.__format__(fmt)

返回 IP 地址的字串表示形式,由顯式格式字串控制。fmt 可以是以下之一:'s',預設選項,等效於 str()'b' 表示零填充的二進位制字串,'X''x' 表示大寫或小寫十六進位制表示形式,或者 'n',它對於 IPv4 地址等效於 'b',對於 IPv6 則等效於 'x'。對於二進位制和十六進位制表示形式,可以使用形式說明符 '#' 和分組選項 '_'__format__formatstr.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"

    可選地,該字串還可以具有一個作用域區域 ID,用字尾 %scope_id 表示。如果存在,作用域 ID 必須是非空的,並且不能包含 %。有關詳細資訊,請參閱 RFC 4007。例如,fe80::1234%1 可以標識節點第一個鏈路上的地址 fe80::1234

  2. 一個適合 128 位的整數。

  3. 一個打包到長度為 16 的 bytes 物件中的整數,大端位元組序。

>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('ff02::5678%1')
IPv6Address('ff02::5678%1')
compressed

地址表示形式的簡寫形式,其中省略了組中的前導零,並且完全由零組成的最長組序列摺疊為單個空組。

這也是 IPv6 地址的 str(addr) 返回的值。

exploded

地址表示形式的長格式,其中包含所有前導零和完全由零組成的組。

對於以下屬性和方法,請參閱 IPv4Address 類的相應文件

packed
reverse_pointer
version
max_prefixlen
is_multicast
is_private
is_global

在 3.4 版本中新增。

is_unspecified
is_reserved
is_loopback
is_site_local

True 如果地址是為站點本地使用而保留的。請注意,站點本地地址空間已被 RFC 3879 棄用。使用 is_private 來測試此地址是否在 RFC 4193 定義的唯一本地地址空間中。

ipv4_mapped

對於看起來像是 IPv4 對映地址(以 ::FFFF/96 開頭)的地址,此屬性將報告嵌入的 IPv4 地址。對於任何其他地址,此屬性將為 None

scope_id

對於 RFC 4007 定義的作用域地址,此屬性會將地址所屬的作用域的特定區域標識為字串。當未指定作用域區域時,此屬性將為 None

sixtofour

對於看起來像是 RFC 3056 定義的 6to4 地址(以 2002::/16 開頭)的地址,此屬性將報告嵌入的 IPv4 地址。對於任何其他地址,此屬性將為 None

teredo

對於看起來像是 RFC 4380 定義的 Teredo 地址(以 2001::/32 開頭)的地址,此屬性將報告嵌入的 (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 作用域地址在轉換為整數時沒有作用域區域 ID。

運算子

地址物件支援一些運算子。除非另有說明,否則運算子只能在相容物件之間應用(即 IPv4 與 IPv4,IPv6 與 IPv6)。

比較運算子

地址物件可以使用通常的比較運算子集進行比較。具有不同作用域區域 ID 的相同 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 網路定義

IPv4NetworkIPv6Network 物件提供了一種用於定義和檢查 IP 網路定義的機制。網路定義由掩碼網路地址組成,因此定義了一個 IP 地址範圍,當用掩碼(二進位制 AND)進行掩碼時,該範圍等於網路地址。例如,掩碼為 255.255.255.0 且網路地址為 192.168.1.0 的網路定義由 192.168.1.0192.168.1.255 包含範圍內的 IP 地址組成。

字首、網路掩碼和主機掩碼

有幾種等效的方式來指定 IP 網路掩碼。字首 /<nbits> 是一種表示網路掩碼中設定了多少高位位的表示法。網路掩碼是一個設定了多個高位位的 IP 地址。因此,字首 /24 等效於 IPv4 中的網路掩碼 255.255.255.0 或 IPv6 中的 ffff:ff00::。此外,主機掩碼網路掩碼的邏輯反轉,有時用於(例如,在 Cisco 訪問控制列表中)表示網路掩碼。與 IPv4 中的 /24 等效的主機掩碼是 0.0.0.255

網路物件

地址物件實現的所有屬性也由網路物件實現。此外,網路物件還實現了其他屬性。所有這些在 IPv4NetworkIPv6Network 之間是通用的,因此為了避免重複,它們僅針對 IPv4Network 進行了文件化。網路物件是 可雜湊的,因此它們可以用作字典中的鍵。

class ipaddress.IPv4Network(address, strict=True)

構造一個 IPv4 網路定義。address 可以是以下之一

  1. 一個字串,由 IP 地址和可選的掩碼組成,並用斜槓(/)分隔。IP 地址是網路地址,掩碼可以是單個數字,這意味著它是字首,也可以是 IPv4 地址的字串表示形式。如果是後者,則如果掩碼以非零欄位開頭,則將其解釋為網路掩碼,如果掩碼以零欄位開頭,則將其解釋為主機掩碼,唯一的例外是全零掩碼,將其視為網路掩碼。如果沒有提供掩碼,則將其視為 /32

    例如,以下 address 規範是等效的:192.168.1.0/24192.168.1.0/255.255.255.0192.168.1.0/0.0.0.255

  2. 一個適合 32 位的整數。這等效於單地址網路,網路地址為 address,掩碼為 /32

  3. 一個以大端序打包到長度為 4 的 bytes 物件中的整數。其解釋與整數 address 類似。

  4. 地址描述和網路掩碼的二元組,其中地址描述可以是字串、32 位整數、4 位元組打包整數或現有 IPv4Address 物件;網路掩碼可以是表示字首長度的整數(例如,24)或表示字首掩碼的字串(例如,255.255.255.0)。

如果 address 不是有效的 IPv4 地址,則會引發 AddressValueError。如果掩碼對於 IPv4 地址無效,則會引發 NetmaskValueError

如果 strictTrue 且在提供的地址中設定了主機位,則會引發 ValueError。否則,主機位將被遮蔽掉,以確定適當的網路地址。

除非另有說明,否則所有接受其他網路/地址物件的網路方法,如果引數的 IP 版本與 self 不相容,則會引發 TypeError

在 3.5 版本中更改:address 建構函式引數添加了二元組形式。

version
max_prefixlen

請參考 IPv4Address 中相應的屬性文件。

is_multicast
is_private
is_unspecified
is_reserved
is_loopback

如果網路地址和廣播地址都為真,則這些屬性對於整個網路都為真。

network_address

網路的網路地址。網路地址和字首長度共同唯一地定義一個網路。

broadcast_address

網路的廣播地址。傳送到廣播地址的資料包應該被網路上的每個主機接收。

hostmask

主機掩碼,作為 IPv4Address 物件。

netmask

網路掩碼,作為 IPv4Address 物件。

with_prefixlen
compressed
exploded

網路的字串表示形式,掩碼採用字首表示法。

with_prefixlencompressed 始終與 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)

如果此網路部分或全部包含在 *other* 中,或者 *other* 全部包含在此網路中,則為 True

address_exclude(network)

計算從此網路中刪除給定 *network* 後產生的網路定義。返回網路物件的迭代器。如果 *network* 沒有完全包含在此網路中,則引發 ValueError

>>> n1 = ip_network('192.0.2.0/28')
>>> n2 = ip_network('192.0.2.1/32')
>>> list(n1.address_exclude(n2))  
[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
 IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
subnets(prefixlen_diff=1, new_prefix=None)

根據引數值,組合以形成當前網路定義的子網。 *prefixlen_diff* 是我們的字首長度應增加的量。 *new_prefix* 是子網所需的新字首;它必須大於我們的字首。 *prefixlen_diff* 和 *new_prefix* 中必須設定一個且僅設定一個。返回網路物件的迭代器。

>>> list(ip_network('192.0.2.0/24').subnets())
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
>>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))  
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26))  
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
 IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    raise ValueError('new prefix must be longer')
ValueError: new prefix must be longer
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
supernet(prefixlen_diff=1, new_prefix=None)

根據引數值,包含此網路定義的超網。 *prefixlen_diff* 是我們的字首長度應減少的量。 *new_prefix* 是超網所需的新字首;它必須小於我們的字首。 *prefixlen_diff* 和 *new_prefix* 中必須設定一個且僅設定一個。返回單個網路物件。

>>> ip_network('192.0.2.0/24').supernet()
IPv4Network('192.0.2.0/23')
>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
IPv4Network('192.0.0.0/22')
>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
IPv4Network('192.0.0.0/20')
subnet_of(other)

如果此網路是 *other* 的子網,則返回 True

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

如果此網路是 *other* 的超網,則返回 True

>>> 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* 進行比較。在此比較中,僅考慮網路地址;不考慮主機位。返回 -101

>>> 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. 一個打包到長度為 16 的 bytes 物件(大端)中的整數。解釋與整數 *address* 類似。

  4. 地址描述和網路掩碼的二元組,其中地址描述是字串、128 位整數、16 位元組打包整數或現有的 IPv6Address 物件;網路掩碼是表示字首長度的整數。

如果 address 不是有效的 IPv6 地址,則會引發 AddressValueError 異常。如果掩碼對於 IPv6 地址無效,則會引發 NetmaskValueError 異常。

如果 strictTrue 且在提供的地址中設定了主機位,則會引發 ValueError。否則,主機位將被遮蔽掉,以確定適當的網路地址。

在 3.5 版本中更改:address 建構函式引數添加了二元組形式。

version
max_prefixlen
is_multicast
is_private
is_unspecified
is_reserved
is_loopback
network_address
broadcast_address
hostmask
netmask
with_prefixlen
compressed
exploded
with_netmask
with_hostmask
num_addresses
prefixlen
hosts()

返回網路中可用主機的迭代器。可用主機是屬於該網路的所有 IP 地址,除了子網路由器任播地址。對於掩碼長度為 127 的網路,子網路由器任播地址也包含在結果中。掩碼為 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 的建構函式中的含義相同,只不過總是接受任意主機地址。

IPv4InterfaceIPv4Address 的子類,因此它繼承了該類的所有屬性。此外,還提供了以下屬性

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 的建構函式中的含義相同,只不過總是接受任意主機地址。

IPv6InterfaceIPv6Address 的子類,因此它繼承了該類的所有屬性。此外,還提供了以下屬性

ip
network
with_prefixlen
with_netmask
with_hostmask

請參閱 IPv4Interface 中相應的屬性文件。

運算子

介面物件支援一些運算子。除非另有說明,否則運算子只能在相容物件之間應用(即 IPv4 與 IPv4,IPv6 與 IPv6)。

邏輯運算子

可以使用常見的邏輯運算子集比較介面物件。

對於相等比較(==!=),物件的 IP 地址和網路都必須相同才能相等。介面不會與任何地址或網路物件進行相等比較。

對於排序(<> 等),規則有所不同。具有相同 IP 版本的介面物件和地址物件可以進行比較,並且地址物件將始終排在介面物件之前。兩個介面物件首先按其網路進行比較,如果網路相同,則按其 IP 地址進行比較。

其他模組級函式

該模組還提供以下模組級函式

ipaddress.v4_int_to_packed(address)

將地址表示為網路(大端)順序的 4 個壓縮位元組。address 是 IPv4 IP 地址的整數表示。如果整數為負數或太大而不能成為 IPv4 IP 地址,則會引發 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 個壓縮位元組。address 是 IPv6 IP 地址的整數表示。如果整數為負數或太大而不能成為 IPv6 IP 地址,則會引發 ValueError

ipaddress.summarize_address_range(first, last)

返回給定第一個和最後一個 IP 地址的彙總網路範圍的迭代器。first 是範圍中的第一個 IPv4AddressIPv6Addresslast 是範圍中的最後一個 IPv4AddressIPv6Address。如果 firstlast 不是 IP 地址或不是同一版本,則會引發 TypeError。如果 last 不大於 firstfirst 地址版本不是 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)

返回摺疊的 IPv4NetworkIPv6Network 物件的迭代器。addresses可迭代物件,其中包含 IPv4NetworkIPv6Network 物件。如果 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)

返回適用於在網路和地址之間排序的鍵。預設情況下,地址和網路物件是不可排序的;它們本質上是不同的,因此表示式

IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')

沒有意義。但是,在某些情況下,您可能希望 ipaddress 無論如何都要對它們進行排序。如果需要這樣做,可以使用此函式作為 sorted() 的 *key* 引數。

obj 是網路或地址物件。

自定義異常

為了支援來自類建構函式的更具體的錯誤報告,該模組定義了以下異常

exception ipaddress.AddressValueError(ValueError)

與地址相關的任何值錯誤。

exception ipaddress.NetmaskValueError(ValueError)

與網路掩碼相關的任何值錯誤。