ipaddress
--- IPv4/IPv6 操作庫?
源代碼: Lib/ipaddress.py
ipaddress
提供了創(chuàng)建、處理和操作 IPv4 和 IPv6 地址和網(wǎng)絡(luò)的功能。
該模塊中的函數(shù)和類可以直接處理與IP地址相關(guān)的各種任務(wù),包括檢查兩個主機是否在同一個子網(wǎng)中,遍歷某個子網(wǎng)中的所有主機,檢查一個字符串是否是一個有效的IP地址或網(wǎng)絡(luò)定義等等。
這是完整的模塊 API 參考—若要查看概述,請見 ipaddress模塊介紹.
3.3 新版功能.
方便的工廠函數(shù)?
ipaddress
模塊提供來工廠函數(shù)來方便地創(chuàng)建 IP 地址,網(wǎng)絡(luò)和接口:
- ipaddress.ip_address(address)?
Return an
IPv4Address
orIPv6Address
object depending on the IP address passed as argument. Either IPv4 or IPv6 addresses may be supplied; integers less than2**32
will be considered to be IPv4 by default. AValueError
is raised if address does not represent a valid IPv4 or IPv6 address.>>> 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)?
Return an
IPv4Network
orIPv6Network
object depending on the IP address passed as argument. address is a string or integer representing the IP network. Either IPv4 or IPv6 networks may be supplied; integers less than2**32
will be considered to be IPv4 by default. strict is passed toIPv4Network
orIPv6Network
constructor. AValueError
is raised if address does not represent a valid IPv4 or IPv6 address, or if the network has host bits set.>>> ipaddress.ip_network('192.168.0.0/28') IPv4Network('192.168.0.0/28')
- ipaddress.ip_interface(address)?
Return an
IPv4Interface
orIPv6Interface
object depending on the IP address passed as argument. address is a string or integer representing the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than2**32
will be considered to be IPv4 by default. AValueError
is raised if address does not represent a valid IPv4 or IPv6 address.
這些方便的函數(shù)的一個缺點是需要同時處理IPv4和IPv6格式,這意味著提供的錯誤信息并不精準(zhǔn),因為函數(shù)不知道是打算采用IPv4還是IPv6格式。更詳細(xì)的錯誤報告可以通過直接調(diào)用相應(yīng)版本的類構(gòu)造函數(shù)來獲得。
IP 地址?
地址對象?
IPv4Address
和 IPv6Address
對象有很多共同的屬性。一些只對IPv6 地址有意義的屬性也在 IPv4Address
對象實現(xiàn),以便更容易編寫正確處理兩種 IP 版本的代碼。地址對象是可哈希的 hashable,所以它們可以作為字典中的鍵來使用。
- class ipaddress.IPv4Address(address)?
構(gòu)造一個 IPv4 地址。 如果 address 不是一個有效的 IPv4 地址,會拋出
AddressValueError
。以下是有效的 IPv4 地址:
以十進制小數(shù)點表示的字符串,由四個十進制整數(shù)組成,范圍為0--255,用點隔開(例如
192.168.0.1
)。每個整數(shù)代表地址中的八位(一個字節(jié))。不允許使用前導(dǎo)零,以免與八進制表示產(chǎn)生歧義。一個32位可容納的整數(shù)。
一個長度為 4 的封裝在
bytes
對象中的整數(shù)(高位優(yōu)先)。
>>> 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 版更改: 前導(dǎo)零可被接受,即使是在可能與八進制表示混淆的情況下也會被接受。
在 3.10 版更改: 前導(dǎo)零不再被接受,并且會被視作錯誤。IPv4地址字符串現(xiàn)在嚴(yán)格按照glibc的
inet_pton()
函數(shù)進行解析。在 3.9.5 版更改: 上述變更也在自3.9.5版本起的Python 3.9當(dāng)中被包含。
在 3.8.12 版更改: 從3.8.12版本開始,Python 3.8中也包含了上述變化。
- version?
合適的版本號:IPv4為
4
,IPv6為6
。
- max_prefixlen?
在該版本的地址表示中,比特數(shù)的總數(shù):IPv4為
32
;IPv6為128
。前綴定義了地址中的前導(dǎo)位數(shù)量,通過比較來確定一個地址是否是網(wǎng)絡(luò)的一部分。
- compressed?
- exploded?
以點符號分割十進制表示的字符串。表示中不包括前導(dǎo)零。
由于IPv4沒有為八位數(shù)設(shè)為零的地址定義速記符號,這兩個屬性始終與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'
這是可用于執(zhí)行PTR查詢的名稱,而不是已解析的主機名本身。
3.5 新版功能.
- is_private?
如果該地址被分配至私有網(wǎng)絡(luò),返回
True
。關(guān)于公共網(wǎng)絡(luò),請參見 iana-ipv4-special-registry (針對IPv4)和 iana-ipv6-special-registry (針對IPv6)。
- is_global?
如果該地址被分配至公共網(wǎng)絡(luò),返回
True
。關(guān)于公共網(wǎng)絡(luò),請參見 iana-ipv4-special-registry (針對IPv4)和 iana-ipv6-special-registry (針對IPv6)。3.4 新版功能.
- is_reserved?
如果該地址屬于互聯(lián)網(wǎng)工程任務(wù)組(IETF)所規(guī)定的其他保留地址,返回
True
。
- IPv4Address.__format__(fmt)?
返回一個IP地址的字符串表示,由一個明確的格式字符串控制。fmt 可以是以下之一:
's'
,默認(rèn)選項,相當(dāng)于str()
,'b'
用于零填充的二進制字符串,'X'
或者'x'
用于大寫或小寫的十六進制表示,或者'n'
相當(dāng)于'b'
用于 IPv4 地址和'x'
用于 IPv6 地址。 對于二進制和十六進制表示法,可以使用形式指定器'#'
和分組選項'_'
。__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)?
構(gòu)造一個 IPv6 地址。 如果 address 不是一個有效的 IPv6 地址,會拋出
AddressValueError
。以下是有效的 IPv6 地址:
一個由八組四個16進制數(shù)字組成的字符串, 每組展示為16位. 以冒號分隔. 這可以描述為 分解 (普通書寫). 此字符可以被 壓縮 (速記書寫) . 詳見:RFC:4291 . 例如,
"0000:0000:0000:0000:0000:0abc:0007:0def"
可以被精簡為"::abc:7:def"
.可選擇的是,該字符串也可以有一個作用域ID,用后綴``%scope_id``表示。如果存在,作用域ID必須是非空的,并且不能包含``%``。詳見:RFC:4007。例如,
fe80::1234%1``可以識別節(jié)點第一條鏈路上的地址``fe80::1234
適合 128 位的整數(shù).
一個打包在長度為 16 字節(jié)的大端序
bytes
對象中的整數(shù)。
>>> ipaddress.IPv6Address('2001:db8::1000') IPv6Address('2001:db8::1000') >>> ipaddress.IPv6Address('ff02::5678%1') IPv6Address('ff02::5678%1')
- compressed?
地址表示的簡短形式,省略了組中的前導(dǎo)零,完全由零組成的最長的組序列被折疊成一個空組。
這也是``str(addr)``對IPv6地址返回的值。
- exploded?
地址的長形式表示,包括所有前導(dǎo)零和完全由零組成的組。
關(guān)于以下屬性和方法,請參見
IPv4Address
類的相應(yīng)文檔。- packed?
- reverse_pointer?
- version?
- max_prefixlen?
- is_multicast?
- is_private?
- is_global?
- is_unspecified?
- is_reserved?
- is_loopback?
- is_link_local?
3.4 新版功能: is_global
- is_site_local?
如果地址被保留用于本地站點則為
True
。 請注意本地站點地址空間已被 RFC 3879 棄用。 請使用is_private
來檢測此地址是否位于 RFC 4193 所定義的本地唯一地址空間中。
- ipv4_mapped?
地址為映射的IPv4地址 (起始為
::FFFF/96
), 此屬性記錄為嵌入IPv4地址. 其他的任何地址, 此屬性為None
.
- scope_id?
對于:RFC:4007`定義的作用域地址,此屬性以字符串的形式確定地址所屬的作用域的特定區(qū)域。當(dāng)沒有指定作用域時,該屬性將是``None`。
- teredo?
對于看起來是:RFC:4380`定義的Teredo地址(以``2001::/32``開頭)的地址,此屬性將返回嵌入式IP地址對``(server, client)`。 對于任何其他地址,該屬性將是``None``。
- IPv6Address.__format__(fmt)?
請參考
IPv4Address
中對應(yīng)的方法文檔。3.9 新版功能.
轉(zhuǎn)換字符串和整數(shù)?
與網(wǎng)絡(luò)模塊互操作像套接字模塊, 地址必須轉(zhuǎn)換為字符串或整數(shù). 這是使用 str()
和 int()
內(nèi)置函數(shù):
>>> 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范圍內(nèi)的地址被轉(zhuǎn)換為沒有范圍區(qū)域ID的整數(shù)。
運算符?
地址對象支持一些運算符。 除非另有說明,運算符只能在兼容對象之間應(yīng)用(即IPv4與IPv4,IPv6與IPv6)。
比較運算符?
地址對象可以用通常的一組比較運算符進行比較。具有不同范圍區(qū)域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
算術(shù)運算符?
整數(shù)可以被添加到地址對象或從地址對象中減去。 一些例子:
>>> 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網(wǎng)絡(luò)的定義?
IPv4Network
和 IPv6Network
對象提供了一個定義和檢查IP網(wǎng)絡(luò)定義的機制。一個網(wǎng)絡(luò)定義由一個 掩碼 和一個 網(wǎng)絡(luò)地址 組成,因此定義了一個IP地址的范圍,當(dāng)用掩碼屏蔽(二進制AND)時,等于網(wǎng)絡(luò)地址。 例如,一個帶有掩碼``255.255.255.0``和網(wǎng)絡(luò)地址``192.168.1.0``的網(wǎng)絡(luò)定義由包括``192.168.1.0``到``192.168.1.255``的IP地址組成。
前綴、網(wǎng)絡(luò)掩碼和主機掩碼?
有幾種相等的方法來指定IP網(wǎng)絡(luò)掩碼。 前綴 /<nbits>``是一個符號,表示在網(wǎng)絡(luò)掩碼中設(shè)置了多少個高階位。 一個 *網(wǎng)絡(luò)掩碼* 是一個設(shè)置了一定數(shù)量高階位的IP地址。 因此,前綴
/24``等同于IPv4中的網(wǎng)絡(luò)掩碼``255.255.255.0``或IPv6中的網(wǎng)絡(luò)掩碼``ffff:ff00::。 此外,*主機掩碼* 是 *網(wǎng)絡(luò)掩碼* 的邏輯取反,有時被用來表示網(wǎng)絡(luò)掩碼(例如在Cisco訪問控制列表中)。 在IPv4中,相當(dāng)于主機掩碼``0.0.0.255``的是
/24`` 。
網(wǎng)絡(luò)對象?
所有由地址對象實現(xiàn)的屬性也由網(wǎng)絡(luò)對象實現(xiàn)。 此外,網(wǎng)絡(luò)對象還實現(xiàn)了額外的屬性。所有這些在 IPv4Network
和 IPv6Network
之間是共同的,所以為了避免重復(fù),它們只在 IPv4Network
中記錄。網(wǎng)絡(luò)對象是 hashable,所以它們可以作為字典中的鍵使用。
- class ipaddress.IPv4Network(address, strict=True)?
構(gòu)建一個 IPv4 網(wǎng)絡(luò)定義。 address 可以是以下之一:
一個由 IP 地址和可選掩碼組成的字符串,用斜線 (
/
) 分開。 IP 地址是網(wǎng)絡(luò)地址,掩碼可以是一個單一的數(shù)字,這意味著它是一個 前綴,或者是一個 IPv4 地址的字符串表示。 如果是后者,如果掩碼以非零字段開始,則被解釋為 網(wǎng)絡(luò)掩碼,如果以零字段開始,則被解釋為 主機掩碼,唯一的例外是全零的掩碼被視為 網(wǎng)絡(luò)掩碼。 如果沒有提供掩碼,它就被認(rèn)為是/32
。例如,以下的*地址*描述是等同的:
192.168.1.0/24
,192.168.1.0/255.255.255.0``和``192.168.1.0/0.0.0.255
一個可轉(zhuǎn)化為32位的整數(shù)。 這相當(dāng)于一個單地址的網(wǎng)絡(luò),網(wǎng)絡(luò)地址是*address*,掩碼是``/32``。
一個整數(shù)被打包成一個長度為 4 的大端序
bytes
對象。 其解釋類似于一個整數(shù) address。一個地址描述和一個網(wǎng)絡(luò)掩碼的雙元組,其中地址描述是一個字符串,一個 32 位的整數(shù),一個 4 字節(jié)的打包整數(shù),或一個現(xiàn)有的 IPv4Address 對象;而網(wǎng)絡(luò)掩碼是一個代表前綴長度的整數(shù) (例如
24
) 或一個代表前綴掩碼的字符串 (例如255.255.255.0
)。
如果 address 不是一個有效的 IPv4 地址則會引發(fā)
AddressValueError
。 如果掩碼不是有效的 IPv4 地址則會引發(fā)NetmaskValueError
。如果 strict 是
True
,并且在提供的地址中設(shè)置了主機位,那么ValueError
將被觸發(fā)。 否則,主機位將被屏蔽掉,以確定適當(dāng)?shù)木W(wǎng)絡(luò)地址。除非另有說明,如果參數(shù)的 IP 版本與
self
不兼容,所有接受其他網(wǎng)絡(luò)/地址對象的網(wǎng)絡(luò)方法都將引發(fā)TypeError
。在 3.5 版更改: 為*address*構(gòu)造函數(shù)參數(shù)添加了雙元組形式。
- version?
- max_prefixlen?
請參考
IPv4Address
中的相應(yīng)屬性文檔。
- is_multicast?
- is_private?
- is_unspecified?
- is_reserved?
- is_loopback?
- is_link_local?
如果這些屬性對網(wǎng)絡(luò)地址和廣播地址都是True,那么它們對整個網(wǎng)絡(luò)來說就是True。
- network_address?
網(wǎng)絡(luò)的網(wǎng)絡(luò)地址。網(wǎng)絡(luò)地址和前綴長度一起唯一地定義了一個網(wǎng)絡(luò)。
- broadcast_address?
網(wǎng)絡(luò)的廣播地址。發(fā)送到廣播地址的數(shù)據(jù)包應(yīng)該被網(wǎng)絡(luò)上的每臺主機所接收。
- hostmask?
主機掩碼,作為一個
IPv4Address
對象。
- netmask?
網(wǎng)絡(luò)掩碼,作為一個
IPv4Address
對象。
- with_prefixlen?
- compressed?
- exploded?
網(wǎng)絡(luò)的字符串表示,其中掩碼為前綴符號。
with_prefixlen
和compressed
總是與str(network)
相同,exploded
使用分解形式的網(wǎng)絡(luò)地址。
- with_netmask?
網(wǎng)絡(luò)的字符串表示,掩碼用網(wǎng)絡(luò)掩碼符號表示。
- with_hostmask?
網(wǎng)絡(luò)的字符串表示,其中的掩碼為主機掩碼符號。
- num_addresses?
網(wǎng)絡(luò)中的地址總數(shù)。
- prefixlen?
網(wǎng)絡(luò)前綴的長度,以比特為單位。
- hosts()?
返回一個網(wǎng)絡(luò)中可用主機的迭代器。 可用的主機是屬于該網(wǎng)絡(luò)的所有IP地址,除了網(wǎng)絡(luò)地址本身和網(wǎng)絡(luò)廣播地址。 對于掩碼長度為31的網(wǎng)絡(luò),網(wǎng)絡(luò)地址和網(wǎng)絡(luò)廣播地址也包括在結(jié)果中。掩碼為32的網(wǎng)絡(luò)將返回一個包含單一主機地址的列表。
>>> 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)?
如果這個網(wǎng)絡(luò)部分或全部包含在*other*中,或者*other*全部包含在這個網(wǎng)絡(luò)中,則為``True``。
- address_exclude(network)?
計算從這個網(wǎng)絡(luò)中移除給定的 network 后產(chǎn)生的網(wǎng)絡(luò)定義。 返回一個網(wǎng)絡(luò)對象的迭代器。 如果 network 不完全包含在這個網(wǎng)絡(luò)中則會引發(fā)
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)?
根據(jù)參數(shù)值,加入的子網(wǎng)構(gòu)成當(dāng)前的網(wǎng)絡(luò)定義。 prefixlen_diff 是我們的前綴長度應(yīng)該增加的數(shù)量。 new_prefix 是所需的子網(wǎng)的新前綴;它必須大于我們的前綴。 必須設(shè)置 prefixlen_diff 和 new_prefix 中的一個,且只有一個。 返回一個網(wǎng)絡(luò)對象的迭代器。
>>> 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)?
包含這個網(wǎng)絡(luò)定義的超級網(wǎng),取決于參數(shù)值。 prefixlen_diff 是我們的前綴長度應(yīng)該減少的數(shù)量。 new_prefix 是超級網(wǎng)的新前綴;它必須比我們的前綴小。 必須設(shè)置 prefixlen_diff 和 new_prefix 中的一個,而且只有一個。 返回一個單一的網(wǎng)絡(luò)對象。
>>> 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)?
如果這個網(wǎng)絡(luò)是*other*的子網(wǎng),則返回``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)?
如果這個網(wǎng)絡(luò)是*other*的超網(wǎng),則返回``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)?
將這個網(wǎng)絡(luò)與*ohter*網(wǎng)絡(luò)進行比較。 在這個比較中,只考慮網(wǎng)絡(luò)地址;不考慮主機位。 返回是``-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)?
構(gòu)建一個 IPv6 網(wǎng)絡(luò)定義。 address 可以是以下之一:
一個由IP地址和可選前綴長度組成的字符串,用斜線(
/
)分開。 IP地址是網(wǎng)絡(luò)地址,前綴長度必須是一個數(shù)字,即*prefix*。 如果沒有提供前綴長度,就認(rèn)為是``/128``。Note that currently expanded netmasks are not supported. That means
2001:db00::0/24
is a valid argument while2001:db00::0/ffff:ff00::
is not.一個適合128位的整數(shù)。 這相當(dāng)于一個單地址網(wǎng)絡(luò),網(wǎng)絡(luò)地址是*address*,掩碼是``/128``。
一個整數(shù)被打包成一個長度為 16 的大端序
bytes
對象。 其解釋類似于一個整數(shù)的 address。一個地址描述和一個網(wǎng)絡(luò)掩碼的雙元組,其中地址描述是一個字符串,一個 128 位的整數(shù),一個 16 字節(jié)的打包整數(shù),或者一個現(xiàn)有的 IPv6Address 對象;而網(wǎng)絡(luò)掩碼是一個代表前綴長度的整數(shù)。
如果 address 不是一個有效的 IPv6 地址則會引發(fā)
AddressValueError
。 如果掩碼對 IPv6 地址無效則會引發(fā)NetmaskValueError
。如果 strict 是
True
,并且在提供的地址中設(shè)置了主機位,那么ValueError
將被觸發(fā)。 否則,主機位將被屏蔽掉,以確定適當(dāng)?shù)木W(wǎng)絡(luò)地址。在 3.5 版更改: 為*address*構(gòu)造函數(shù)參數(shù)添加了雙元組形式。
- 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()?
返回一個網(wǎng)絡(luò)中可用主機的迭代器。 可用的主機是屬于該網(wǎng)絡(luò)的所有IP地址,除了Subnet-Router任播的地址。 對于掩碼長度為127的網(wǎng)絡(luò),子網(wǎng)-路由器任播地址也包括在結(jié)果中。掩碼為128的網(wǎng)絡(luò)將返回一個包含單一主機地址的列表。
- 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
中的相應(yīng)屬性文檔。
- is_site_local?
如果這些屬性對網(wǎng)絡(luò)地址和廣播地址都是True,那么對整個網(wǎng)絡(luò)來說就是True。
運算符?
網(wǎng)絡(luò)對象支持一些運算符。 除非另有說明,運算符只能在兼容的對象之間應(yīng)用(例如,IPv4與IPv4,IPv6與IPv6)。
邏輯運算符?
網(wǎng)絡(luò)對象可以用常規(guī)的邏輯運算符集進行比較。網(wǎng)絡(luò)對象首先按網(wǎng)絡(luò)地址排序,然后按網(wǎng)絡(luò)掩碼排序。
迭代?
網(wǎng)絡(luò)對象可以被迭代,以列出屬于該網(wǎng)絡(luò)的所有地址。 對于迭代,所有 主機都會被返回,包括不可用的主機(對于可用的主機,使用 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')
作為地址容器的網(wǎng)絡(luò)?
網(wǎng)絡(luò)對象可以作為地址的容器。 一些例子:
>>> 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
接口對象?
接口對象是 hashable 的,所以它們可以作為字典中的鍵使用。
- class ipaddress.IPv4Interface(address)?
構(gòu)建一個 IPv4 接口。 address 的含義與
IPv4Network
構(gòu)造器中的一樣,不同之處在于任意主機地址總是會被接受。IPv4Interface
是IPv4Address
的一個子類,所以它繼承了該類的所有屬性。 此外,還有以下屬性可用:- ip?
地址(
IPv4Address
)沒有網(wǎng)絡(luò)信息。>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.ip IPv4Address('192.0.2.5')
- network?
該接口所屬的網(wǎng)絡(luò)(
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?
帶有網(wǎng)絡(luò)的接口的網(wǎng)絡(luò)掩碼字符串表示。
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_netmask '192.0.2.5/255.255.255.0'
- with_hostmask?
帶有網(wǎng)絡(luò)的接口的主機掩碼字符串表示。
>>> interface = IPv4Interface('192.0.2.5/24') >>> interface.with_hostmask '192.0.2.5/0.0.0.255'
- class ipaddress.IPv6Interface(address)?
構(gòu)建一個 IPv6 接口。 address 的含義與
IPv6Network
構(gòu)造器中的一樣,不同之處在于任意主機地址總是會被接受。IPv6Interface
是IPv6Address
的一個子類,所以它繼承了該類的所有屬性。 此外,還有以下屬性可用:- ip?
- network?
- with_prefixlen?
- with_netmask?
- with_hostmask?
請參考
IPv4Interface
中的相應(yīng)屬性文檔。
運算符?
接口對象支持一些運算符。 除非另有說明,運算符只能在兼容的對象之間應(yīng)用(即IPv4與IPv4,IPv6與IPv6)。
邏輯運算符?
接口對象可以用通常的邏輯運算符集進行比較。
對于相等比較(==``和
!=``),IP地址和網(wǎng)絡(luò)都必須是相同的對象才會相等。 一個接口不會與任何地址或網(wǎng)絡(luò)對象相等。
對于排序 (<
、>
等),規(guī)則是不同的。 具有相同 IP 版本的接口和地址對象可以被比較,而地址對象總是在接口對象之前排序。 兩個接口對象首先通過它們的網(wǎng)絡(luò)進行比較,如果它們是相同的,則通過它們的 IP 地址進行比較。
其他模塊級別函數(shù)?
該模塊還提供以下模塊級函數(shù):
- ipaddress.v4_int_to_packed(address)?
以網(wǎng)絡(luò)(大端序)順序?qū)⒁粋€地址表示為 4 個打包的字節(jié)。address 是一個 IPv4 IP 地址的整數(shù)表示。 如果整數(shù)是負(fù)數(shù)或太大而不滿足 IPv4 IP 地址要求,會觸發(fā)一個
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)?
以網(wǎng)絡(luò)(大端序)順序?qū)⒁粋€地址表示為 4 個打包的字節(jié)。address 是一個IPv6 IP地址的整數(shù)表示。 如果整數(shù)是負(fù)數(shù)或太大而不滿足 IPv6 IP 地址要求,會觸發(fā)一個
ValueError
。
- ipaddress.summarize_address_range(first, last)?
給出第一個和最后一個 IP 地址,返回總結(jié)的網(wǎng)絡(luò)范圍的迭代器。 first 是范圍內(nèi)的第一個
IPv4Address
或IPv6Address
,last 是范圍內(nèi)的最后一個IPv4Address
或IPv6Address
。 如果 first 或 last 不是IP地址或不是同一版本則會引發(fā)TypeError
。 如果 last 不大于 first,或者 first 的地址版本不是 4 或 6 則會引發(fā)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 包含混合版本的對象則會引發(fā)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)?
返回一個適合在網(wǎng)絡(luò)和地址之間進行排序的鍵。 地址和網(wǎng)絡(luò)對象在默認(rèn)情況下是不可排序的;它們在本質(zhì)上是不同的,所以表達式:
IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
是沒有意義的。 然而,有些時候,你可能希望讓
ipaddress
對這些進行排序。 如果你需要這樣做,你可以使用這個函數(shù)作為sorted()
的 key 參數(shù)。obj 是一個網(wǎng)絡(luò)或地址對象。
自定義異常?
為了支持來自類構(gòu)造函數(shù)的更具體的錯誤報告,模塊定義了以下異常:
- exception ipaddress.AddressValueError(ValueError)?
與地址有關(guān)的任何數(shù)值錯誤。
- exception ipaddress.NetmaskValueError(ValueError)?
與網(wǎng)絡(luò)掩碼有關(guān)的任何數(shù)值錯誤。