2015-04-23 40 views
1

我想了解一些代碼如何在https://pythonhosted.org/netaddr/tutorial_01.html上的netaddr Python教程中運行。特別是以下教程。瞭解Python的netaddr庫命令

總結地址和子網

另一個有用的操作列表總結IP 子網和地址組的能力,將它們合併在一起,在可能情況下創建 CIDR子網的最小可能的名單。

您可以在netaddr中使用cidr_merge()函數執行此操作。

首先,我們創建一個IP對象列表,其中包含各個地址和子網的良好組合,以及一些基於字符串的IP 地址值,以實現良好的度量。爲了使事情更有趣一些 IPv6地址也被引入。

>>> ip_list = [ip for ip in IPNetwork('fe80::/120')] 
>>> ip_list.append(IPNetwork('192.0.2.0/24')) 
>>> ip_list.extend([str(ip) for ip in IPNetwork('192.0.3.0/24')]) 
>>> ip_list.append(IPNetwork('192.0.4.0/25')) 
>>> ip_list.append(IPNetwork('192.0.4.128/25')) 
>>> len(ip_list) 
515 
>>> cidr_merge(ip_list) 
[IPNetwork('192.0.2.0/23'), IPNetwork('192.0.4.0/24'), IPNetwork('fe80::/120')] 

我與現有的不同選擇有點糊塗。 ip_list.extend([str(ip) for ip in IPNetwork('192.0.3.0/24')])ip_list.append(IPNetwork('192.0.4.0/25'))有什麼區別?

如果我不想用IPv6(fe80::/120)開始列表,而是想使用IPv4(192.0.4.0/24),那麼語法是什麼。它會像以下那樣簡單嗎?

ip_list = IPNetwork('192.0.4.0/25') 

謝謝。

回答

1

該代碼試圖證明cidr_merge()函數可以將一列netaddr.IPAddress對象,IP地址字符串和netaddr.IPNetwork對象合併到一組最小的IP地址和子網中。爲此,創建一個包含各種IP地址相關對象的Python列表。然後將該列表傳遞給cidr_merge()以顯示IP地址對象已合併到最小的對象集合中。

最初,它創建了一個Python列表ip_list,其中包含多個單獨的對象netaddr.IPAddress。在此列表中,它追加了一個IPNetwork子網對象。注意,這是一個標準的Python列表操作 - list.append()只是增加了它的參數的列表的末尾,e.g:

>>> l = [1, 2] 
>>> l.append(3) 
>>> print l 
[1, 2, 3] 

list.extend()延伸與來自另一個列表中的元素的給定列表(以及,任何可迭代實際上),例如

>>> l.extend([4, 5, 6]) 
>>> print l 
[1, 2, 3, 4, 5, 6] 

有關這些列表操作的更多詳細信息,請參閱Python documentation

所以,是的,它是非常簡單:

>>> ip_list = [IPNetwork('192.0.4.0/25')] # create a list containing IPNetwork object 
>>> print ip_list 
[IPNetwork('192.0.4.0/25')] 

及附加/根據需要擴展列表。

+0

感謝您的好解釋。你能告訴我,ip_list.extend(IP網絡中的[str(ip)('192.0.3.0/24')])和ip_list.append(IPNetwork('192.0.3.0/24 「))'? – algorhythm

+0

@CMac:爲什麼不在每個操作在空列表上執行後查看列表?這將清楚地表明'ip_list'存在差異。但是,'cidr_merge()'運行後的結果應該是相同的,即兩個列表應該給出'[IPNetwork('192.0.3.0/24')]'。 – mhawke