使用 python netaddr cidr_merge 汇总相邻子网

Gho*_*ost 6 python python-3.x

netaddr.cidr_merge我有一个 IP 网络列表,即使其中一些是相邻的,也不会合并。难道我做错了什么?

>>> from netaddr import IPNetwork, cidr_merge
>>> iplist = [
         IPNetwork('10.105.205.8/29'), 
         IPNetwork('10.105.205.16/28'), 
         IPNetwork('10.105.205.32/27'), 
         IPNetwork('10.105.205.64/26'), 
         IPNetwork('10.105.205.128/26'),
         IPNetwork('10.105.205.192/28'),
         IPNetwork('10.105.205.208/29'),
         IPNetwork('10.105.206.48/28'),
         IPNetwork('10.105.206.80/28')
    ]
>>> summary = cidr_merge(iplist)
>>> summary == iplist
    True
Run Code Online (Sandbox Code Playgroud)

我在 Mac OSX 10.8.5 上使用 Python 3.3.4 和 netaddr 7.12。

Gho*_*ost 4

@黄昏沃夫-

感谢你的回复。我同意第一部分,但第二部分......我想我知道你的意思,但它不是 100% 准确。例如,如果我从上面获取编辑后的列表,并附加 10.105.205.0/29。子网将汇总为 /25。是的,它们必须是 2 的幂,但在 netaddr 进行汇总之前,整个子网的所有部分都必须存在,无论它们的大小是否相等。

   iplist =[
        IPNetwork('10.105.205.8/29'), 
        IPNetwork('10.105.205.16/28'), 
        IPNetwork('10.105.205.32/27'), 
        IPNetwork('10.105.205.64/26'),
        ]
    >>> iplist.append(IPNetwork('10.105.205.0/29'))
    >>> netaddr.cidr_merge(iplist)
        [IPNetwork('10.105.205.0/25')]
Run Code Online (Sandbox Code Playgroud)