2015-04-23 32 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