ipaddress --- IPv4/IPv6 操作庫

原始碼: Lib/ipaddress.py


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

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

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

在 3.3 版本加入。

便捷工廠函式

ipaddress 模組提供了工廠函式,可以方便地建立 IP 地址、網路和介面。

ipaddress.ip_address(address)

根據傳入的 IP 地址引數返回一個 IPv4AddressIPv6Address 物件。可以提供 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)

根據傳入的 IP 地址引數返回一個 IPv4NetworkIPv6Network 物件。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)

根據傳入的 IP 地址引數返回一個 IPv4InterfaceIPv6Interface 物件。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(含)之間,用點分隔(例如 192.168.0.1)。每個整數代表地址中的一個八位位元組(byte)。不允許前導零,以防止與八進位制表示法混淆。

  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

在 3.14 版本發生變更: 使其在類上可用。

max_prefixlen

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

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

在 3.14 版本發生變更: 使其在類上可用。

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
    

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

在 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

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

在 3.4 版本加入。

在 3.13 版本發生變更: 修復了一些假陽性和假陰性,詳見 is_private

is_unspecified

如果地址是未指定的,則為 True。參見 RFC 5735(適用於 IPv4)或 RFC 2373(適用於 IPv6)。

is_reserved

如果地址被 IETF 標記為保留,則為 True。對於 IPv4,這僅指 240.0.0.0/4,即 Reserved 地址塊。對於 IPv6,這是指所有被分配為 Reserved by IETF 以供將來使用的地址。

備註

對於 IPv4,is_reservediana-ipv4-special-registryReserved-by-Protocol 列的地址塊值無關。

注意

對於 IPv6,fec0::/10,一個以前的站點本地範圍地址字首,目前被排除在該列表之外(參見 is_site_localRFC 3879)。

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-string 使用。

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

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

teredo

對於看起來是 Teredo 地址(以 2001::/32 開頭)的地址,如 RFC 4380 所定義,此屬性將報告嵌入的 (server, client) IP 地址對。對於任何其他地址,此屬性將為 None

IPv6Address.__format__(fmt)

請參閱 IPv4Address 中相應方法的文件。

在 3.9 版本中新增。

轉換為字串和整數

為了與網路介面(如 socket 模組)互操作,地址必須轉換為字串或整數。這透過使用內建函式 str()int() 來處理:

>>> str(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> int(ipaddress.IPv4Address('192.168.0.1'))
3232235521
>>> str(ipaddress.IPv6Address('::1'))
'::1'
>>> int(ipaddress.IPv6Address('::1'))
1

請注意,IPv6 範圍地址在轉換為整數時會不帶範圍區域 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 地址範圍,這些 IP 地址在與掩碼進行掩碼運算(二進位制與)後等於網路地址。例如,一個掩碼為 255.255.255.0、網路地址為 192.168.1.0 的網路定義,包含了從 192.168.1.0192.168.1.255 的 IP 地址範圍(包含兩端)。

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

有幾種等效的方式來指定 IP 網路掩碼。*字首* /<nbits> 是一種表示法,表示網路掩碼中有多少個高位被設定為 1。*網路掩碼*是一個 IP 地址,其中有若干高位被設定為 1。因此,字首 /24 等同於 IPv4 中的網路掩碼 255.255.255.0,或 IPv6 中的 ffff:ff00::。此外,*主機掩碼*是*網路掩碼*的邏輯反碼,有時用於表示網路掩碼(例如在思科訪問控制列表中)。與 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_diffnew_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_diffnew_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 地址是網路地址,字首長度必須是一個數字,即*字首*。如果未提供字首長度,則預設為 /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

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

運算子

網路物件支援一些運算子。除非另有說明,運算子只能在相容的物件之間應用(即 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 不大於 first,或者 first 地址的版本不是 4 或 6,則會引發 ValueError

>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(
...    ipaddress.IPv4Address('192.0.2.0'),
...    ipaddress.IPv4Address('192.0.2.130'))]
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
ipaddress.collapse_addresses(addresses)

返回一個摺疊後的 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)

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