ipaddress
— IPv4/IPv6 操作庫¶
原始碼: Lib/ipaddress.py
ipaddress
提供了建立、操作和處理 IPv4 和 IPv6 地址和網路的功能。
此模組中的函式和類使得處理與 IP 地址相關的各種任務變得簡單,包括檢查兩個主機是否在同一子網上、迭代特定子網中的所有主機、檢查字串是否表示有效的 IP 地址或網路定義,等等。
這是完整的模組 API 參考—有關概述和介紹,請參見ipaddress 模組簡介。
在 3.3 版本中新增。
便捷工廠函式¶
ipaddress
模組提供了便捷的工廠函式來建立 IP 地址、網路和介面。
- ipaddress.ip_address(address)¶
返回一個
IPv4Address
或IPv6Address
物件,具體取決於作為引數傳遞的 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)¶
返回一個
IPv4Network
或IPv6Network
物件,具體取決於作為引數傳遞的 IP 地址。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)¶
返回一個
IPv4Interface
或IPv6Interface
物件,具體取決於作為引數傳遞的 IP 地址。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(包括 0 和 255),用點分隔(例如,
192.168.0.1
)。每個整數表示地址中的一個八位位元組(位元組)。不容忍前導零,以防止與八進位制表示法混淆。一個適合 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
。
- max_prefixlen¶
此版本的地址表示中的總位數:IPv4 為
32
,IPv6 為128
。字首定義了地址中用於確定地址是否屬於網路的前導位數。
- 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
除了共享地址空間(
100.64.0.0/10
範圍)它們都為False
之外,is_private
的值與is_global
相反。在 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
除了共享地址空間(
100.64.0.0/10
範圍)它們都為False
之外,is_global
的值與is_private
相反。在 3.4 版本中新增。
在 3.13 版本中更改: 修復了一些誤報和漏報,詳情請參閱
is_private
。
- is_reserved¶
如果該地址是 IETF 保留的,則為
True
。
- 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 字串使用。>>> 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_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 地址範圍,當用掩碼(二進位制 AND)進行掩碼時,該範圍等於網路地址。例如,掩碼為 255.255.255.0
且網路地址為 192.168.1.0
的網路定義由 192.168.1.0
到 192.168.1.255
包含範圍內的 IP 地址組成。
字首、網路掩碼和主機掩碼¶
有幾種等效的方式來指定 IP 網路掩碼。字首 /<nbits>
是一種表示網路掩碼中設定了多少高位位的表示法。網路掩碼是一個設定了多個高位位的 IP 地址。因此,字首 /24
等效於 IPv4 中的網路掩碼 255.255.255.0
或 IPv6 中的 ffff:ff00::
。此外,主機掩碼是網路掩碼的邏輯反轉,有時用於(例如,在 Cisco 訪問控制列表中)表示網路掩碼。與 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 地址是網路地址,字首長度必須是單個數字,即 *prefix* 。如果未提供字首長度,則將其視為/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¶
如果對於網路地址和廣播地址都為 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
的建構函式中的含義相同,只不過總是接受任意主機地址。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)¶
與網路掩碼相關的任何值錯誤。