ipaddress
--- IPv4/IPv6 操作庫¶
原始碼: Lib/ipaddress.py
ipaddress
模組提供了建立、操作 IPv4 和 IPv6 地址與網路的功能。
此模組中的函式和類使得處理與 IP 地址相關的各種任務變得簡單明瞭,包括檢查兩個主機是否在同一子網、迭代特定子網中的所有主機、檢查字串是否表示有效的 IP 地址或網路定義等等。
這是完整的模組 API 參考 --- 有關概述和介紹,請參閱 ipaddress 模組介紹。
在 3.3 版本加入。
便捷工廠函式¶
ipaddress
模組提供了工廠函式,可以方便地建立 IP 地址、網路和介面。
- ipaddress.ip_address(address)¶
根據傳入的 IP 地址引數返回一個
IPv4Address
或IPv6Address
物件。可以提供 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 地址引數返回一個
IPv4Network
或IPv6Network
物件。address 是一個表示 IP 網路的字串或整數。可以提供 IPv4 或 IPv6 網路;小於2**32
的整數預設被視為 IPv4 地址。strict 會被傳遞給IPv4Network
或IPv6Network
的建構函式。如果 address 不表示有效的 IPv4 或 IPv6 地址,或者網路地址中設定了主機位,則會引發ValueError
。>>> ipaddress.ip_network('192.168.0.0/28') IPv4Network('192.168.0.0/28')
- ipaddress.ip_interface(address)¶
根據傳入的 IP 地址引數返回一個
IPv4Interface
或IPv6Interface
物件。address 是一個表示 IP 地址的字串或整數。可以提供 IPv4 或 IPv6 地址;小於2**32
的整數預設被視為 IPv4 地址。如果 address 不表示有效的 IPv4 或 IPv6 地址,則會引發ValueError
。
這些便捷函式的一個缺點是,由於需要同時處理 IPv4 和 IPv6 格式,錯誤訊息提供的精確錯誤資訊非常有限,因為函式不知道預期的是 IPv4 還是 IPv6 格式。透過直接呼叫相應版本特定的類建構函式,可以獲得更詳細的錯誤報告。
IP 地址¶
地址物件¶
IPv4Address
和 IPv6Address
物件共享許多共同的屬性。一些僅對 IPv6 地址有意義的屬性也由 IPv4Address
物件實現,以便於編寫能正確處理兩種 IP 版本的程式碼。地址物件是可雜湊的,因此可以用作字典的鍵。
- class ipaddress.IPv4Address(address)¶
構造一個 IPv4 地址。如果 address 不是一個有效的 IPv4 地址,則會引發
AddressValueError
。以下構成一個有效的 IPv4 地址:
一個點分十進位制表示的字串,由四個十進位制整陣列成,範圍在 0-255(含)之間,用點分隔(例如
192.168.0.1
)。每個整數代表地址中的一個八位位元組(byte)。不允許前導零,以防止與八進位制表示法混淆。一個能容納在 32 位中的整數。
一個打包成長度為 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 地址的顯示程式碼更加容易。
- 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_private¶
如果地址被 iana-ipv4-special-registry(適用於 IPv4)或 iana-ipv6-special-registry(適用於 IPv6)定義為非全域性可達,則為
True
,但有以下例外:對於共享地址空間(
100.64.0.0/10
),is_private
為False
。對於 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/32
和192.0.0.10/32
除外(以前:只有192.0.0.0/29
子範圍被視為私有)。64:ff9b:1::/48
被視為私有。2002::/16
被視為私有。在
2001::/23
(否則被視為私有)記憶體在例外:2001:1::1/128
、2001:1::2/128
、2001:3::/32
、2001:4:112::/48
、2001:20::/28
、2001: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_reserved¶
如果地址被 IETF 標記為保留,則為
True
。對於 IPv4,這僅指240.0.0.0/4
,即Reserved
地址塊。對於 IPv6,這是指所有被分配為Reserved by IETF
以供將來使用的地址。備註
對於 IPv4,
is_reserved
與 iana-ipv4-special-registry 中Reserved-by-Protocol
列的地址塊值無關。注意
對於 IPv6,
fec0::/10
,一個以前的站點本地範圍地址字首,目前被排除在該列表之外(參見is_site_local
和 RFC 3879)。
- 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__
由format
、str.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 地址:
一個由八組四位十六進位制數字組成的字串,每組代表 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
。一個能容納在 128 位中的整數。
一個打包成長度為 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_link_local¶
- is_site_local¶
如果地址被保留用於站點本地使用,則為
True
。請注意,站點本地地址空間已被 RFC 3879 廢棄。使用is_private
來測試此地址是否在 RFC 4193 定義的唯一本地地址空間內。
- ipv4_mapped¶
對於看起來是 IPv4 對映地址(以
::FFFF/96
開頭)的地址,此屬性將報告嵌入的 IPv4 地址。對於任何其他地址,此屬性將為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 網路定義¶
IPv4Network
和 IPv6Network
物件提供了一種定義和檢查 IP 網路定義的機制。網路定義由一個*掩碼*和一個*網路地址*組成,因此定義了一個 IP 地址範圍,這些 IP 地址在與掩碼進行掩碼運算(二進位制與)後等於網路地址。例如,一個掩碼為 255.255.255.0
、網路地址為 192.168.1.0
的網路定義,包含了從 192.168.1.0
到 192.168.1.255
的 IP 地址範圍(包含兩端)。
字首、網路掩碼和主機掩碼¶
有幾種等效的方式來指定 IP 網路掩碼。*字首* /<nbits>
是一種表示法,表示網路掩碼中有多少個高位被設定為 1。*網路掩碼*是一個 IP 地址,其中有若干高位被設定為 1。因此,字首 /24
等同於 IPv4 中的網路掩碼 255.255.255.0
,或 IPv6 中的 ffff:ff00::
。此外,*主機掩碼*是*網路掩碼*的邏輯反碼,有時用於表示網路掩碼(例如在思科訪問控制列表中)。與 IPv4 中的 /24
等效的主機掩碼是 0.0.0.255
。
網路物件¶
地址物件實現的所有屬性,網路物件也都實現。此外,網路物件還實現了額外的屬性。所有這些屬性在 IPv4Network
和 IPv6Network
之間是通用的,為避免重複,僅在 IPv4Network
中進行文件說明。網路物件是可雜湊的,因此可以用作字典的鍵。
- class ipaddress.IPv4Network(address, strict=True)¶
構造一個 IPv4 網路定義。address 可以是以下之一:
一個由 IP 地址和可選掩碼組成的字串,用斜槓(
/
)分隔。IP 地址是網路地址,掩碼可以是一個數字,表示它是一個*字首*,也可以是一個 IPv4 地址的字串表示。如果是後者,如果掩碼以非零欄位開頭,則被解釋為*網路掩碼*;如果以零欄位開頭,則被解釋為*主機掩碼*,唯一的例外是全零掩碼,它被視為*網路掩碼*。如果未提供掩碼,則預設為/32
。例如,以下 address 規範是等效的:
192.168.1.0/24
、192.168.1.0/255.255.255.0
和192.168.1.0/0.0.0.255
。一個能容納在 32 位中的整數。這相當於一個單地址網路,其中網路地址為 address,掩碼為
/32
。一個打包成長度為 4 的
bytes
物件的整數,大端序。其解釋與整數 address 類似。一個由地址描述和網路掩碼組成的二元組,其中地址描述可以是字串、32 位整數、4 位元組打包整數或現有的
IPv4Address
物件;網路掩碼可以是一個表示字首長度的整數(例如24
)或一個表示字首掩碼的字串(例如255.255.255.0
)。
如果 address 不是有效的 IPv4 地址,則會引發
AddressValueError
。如果掩碼對 IPv4 地址無效,則會引發NetmaskValueError
。如果 strict 為
True
且提供的地址中設定了主機位,則會引發ValueError
。否則,主機位將被遮蔽掉以確定適當的網路地址。除非另有說明,所有接受其他網路/地址物件的網路方法,如果引數的 IP 版本與
self
不相容,將引發TypeError
。在 3.5 版本發生變更: 為 address 建構函式引數添加了二元組形式。
- version¶
- max_prefixlen¶
請參閱
IPv4Address
中相應屬性的文件。
- is_multicast¶
- is_private¶
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
如果這些屬性對於網路地址和廣播地址都為真,那麼它們對於整個網路也為真。
- network_address¶
網路的網路地址。網路地址和字首長度共同唯一地定義了一個網路。
- broadcast_address¶
網路的廣播地址。傳送到廣播地址的資料包應該被網路上的每個主機接收。
- hostmask¶
主機掩碼,作為一個
IPv4Address
物件。
- netmask¶
網路掩碼,作為一個
IPv4Address
物件。
- with_prefixlen¶
- compressed¶
- exploded¶
網路的字串表示,掩碼採用字首表示法。
with_prefixlen
和compressed
總是與str(network)
相同。exploded
使用網路地址的展開形式。
- with_netmask¶
網路的字串表示,掩碼採用網路掩碼錶示法。
- with_hostmask¶
網路的字串表示,掩碼採用主機掩碼錶示法。
- num_addresses¶
網路中的地址總數。
- prefixlen¶
網路字首的長度,以位為單位。
- hosts()¶
返回網路中可用主機的迭代器。可用主機是屬於該網路的所有 IP 地址,除了網路地址本身和網路廣播地址。對於掩碼長度為 31 的網路,網路地址和網路廣播地址也包含在結果中。掩碼為 32 的網路將返回一個包含單個主機地址的列表。
>>> list(ip_network('192.0.2.0/29').hosts()) [IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'), IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'), IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')] >>> list(ip_network('192.0.2.0/31').hosts()) [IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')] >>> list(ip_network('192.0.2.1/32').hosts()) [IPv4Address('192.0.2.1')]
- overlaps(other)¶
如果此網路部分或全部包含在 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 進行比較。在此比較中,只考慮網路地址;不考慮主機位。返回
-1
、0
或1
。>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32')) -1 >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32')) 1 >>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32')) 0
自 3.7 版本起已棄用: 它使用與“<”、“==”和“>”相同的排序和比較演算法。
- class ipaddress.IPv6Network(address, strict=True)¶
構造一個 IPv6 網路定義。address 可以是以下之一:
一個由 IP 地址和可選字首長度組成的字串,用斜槓(
/
)分隔。IP 地址是網路地址,字首長度必須是一個數字,即*字首*。如果未提供字首長度,則預設為/128
。請注意,目前不支援展開的網路掩碼。這意味著
2001:db00::0/24
是一個有效的引數,而2001:db00::0/ffff:ff00::
不是。一個能容納在 128 位中的整數。這相當於一個單地址網路,其中網路地址為 address,掩碼為
/128
。一個打包成長度為 16 的
bytes
物件的整數,大端序。其解釋與整數 address 類似。一個由地址描述和網路掩碼組成的二元組,其中地址描述可以是字串、128 位整數、16 位元組打包整數或現有的
IPv6Address
物件;網路掩碼是一個表示字首長度的整數。
如果 address 不是有效的 IPv6 地址,則會引發
AddressValueError
。如果掩碼對 IPv6 地址無效,則會引發NetmaskValueError
。如果 strict 為
True
且提供的地址中設定了主機位,則會引發ValueError
。否則,主機位將被遮蔽掉以確定適當的網路地址。在 3.5 版本發生變更: 為 address 建構函式引數添加了二元組形式。
- version¶
- max_prefixlen¶
- is_multicast¶
- is_private¶
- is_unspecified¶
- is_reserved¶
- is_loopback¶
- is_link_local¶
- network_address¶
- broadcast_address¶
- hostmask¶
- netmask¶
- with_prefixlen¶
- compressed¶
- exploded¶
- with_netmask¶
- with_hostmask¶
- num_addresses¶
- prefixlen¶
- hosts()¶
返回網路中可用主機的迭代器。可用主機是屬於該網路的所有 IP 地址,除了子網-路由器任播地址。對於掩碼長度為 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
建構函式中相同,但始終接受任意主機地址。IPv4Interface
是IPv4Address
的子類,因此它繼承了該類的所有屬性。此外,還提供以下屬性:- ip¶
不帶網路資訊的地址(
IPv4Address
)。>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.ip IPv4Address('192.0.2.5')
- network¶
此介面所屬的網路(
IPv4Network
)。>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.network IPv4Network('192.0.2.0/24')
- with_prefixlen¶
介面的字串表示,掩碼採用字首表示法。
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_prefixlen '192.0.2.5/24'
- with_netmask¶
介面的字串表示,網路作為網路掩碼。
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_netmask '192.0.2.5/255.255.255.0'
- with_hostmask¶
介面的字串表示,網路作為主機掩碼。
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_hostmask '192.0.2.5/0.0.0.255'
- class ipaddress.IPv6Interface(address)¶
構造一個 IPv6 介面。address 的含義與
IPv6Network
建構函式中相同,但始終接受任意主機地址。IPv6Interface
是IPv6Address
的子類,因此它繼承了該類的所有屬性。此外,還提供以下屬性:- ip¶
- network¶
- with_prefixlen¶
- with_netmask¶
- with_hostmask¶
請參閱
IPv4Interface
中相應屬性的文件。
運算子¶
介面物件支援一些運算子。除非另有說明,運算子只能在相容的物件之間應用(即 IPv4 與 IPv4,IPv6 與 IPv6)。
邏輯運算子¶
介面物件可以使用通常的邏輯運算子進行比較。
對於相等性比較(==
和 !=
),IP 地址和網路都必須相同,物件才相等。介面物件不會與任何地址或網路物件相等。
對於排序(<
、>
等),規則不同。具有相同 IP 版本的介面和地址物件可以進行比較,地址物件總是排在介面物件之前。兩個介面物件首先按其網路進行比較,如果網路相同,則按其 IP 地址進行比較。
其他模組級函式¶
該模組還提供了以下模組級函式:
- ipaddress.v4_int_to_packed(address)¶
將地址表示為網路順序(大端序)的 4 個打包位元組。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 是範圍內的第一個
IPv4Address
或IPv6Address
,last 是範圍內的最後一個IPv4Address
或IPv6Address
。如果 first 或 last 不是 IP 地址或它們的版本不同,則會引發TypeError
。如果 last 不大於 first,或者 first 地址的版本不是 4 或 6,則會引發ValueError
。>>> [ipaddr for ipaddr in ipaddress.summarize_address_range( ... ipaddress.IPv4Address('192.0.2.0'), ... ipaddress.IPv4Address('192.0.2.130'))] [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
- ipaddress.collapse_addresses(addresses)¶
返回一個摺疊後的
IPv4Network
或IPv6Network
物件迭代器。addresses 是一個由IPv4Network
或IPv6Network
物件組成的可迭代物件。如果 addresses 包含混合版本的物件,則會引發TypeError
。>>> [ipaddr for ipaddr in ... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'), ... ipaddress.IPv4Network('192.0.2.128/25')])] [IPv4Network('192.0.2.0/24')]
自定義異常¶
為了支援從類建構函式中報告更具體的錯誤,該模組定義了以下異常
- exception ipaddress.AddressValueError(ValueError)¶
任何與地址相關的值錯誤。
- exception ipaddress.NetmaskValueError(ValueError)¶
任何與子網掩碼相關的值錯誤。