ipaddress.collapse_addresses() 可能会崩溃超过 1 位的掩码?

may ipaddress.collapse_addresses() collapse for more than 1 bit of the mask?

为什么:

>>> import ipaddress
>>> print [ip for ip in ipaddress.collapse_addresses([ipaddress.IPv4Network(u'192.0.128.0/24'), ipaddress.IPv4Network(u'192.0.129.0/24')])]
[IPv4Network(u'192.0.128.0/23')]

但是:

>>> print [ip for ip in ipaddress.collapse_addresses([ipaddress.IPv4Network(u'192.0.129.0/24'), ipaddress.IPv4Network(u'192.0.130.0/24')])]
[IPv4Network(u'192.0.129.0/24'), IPv4Network(u'192.0.130.0/24')]

我想要达到的目标:

>>> print [ip for ip in ipaddress.collapse_addresses([ipaddress.IPv4Network(u'192.0.129.0/24'), ipaddress.IPv4Network(u'192.0.130.0/24')])]
[IPv4Network(u'192.0.128.0/22')]

似乎 collapse_addresses 无法折叠超过 1 位的掩码。

这个函数returns包含列表中ipv4网络的最小网络:

ADDRESS_ANY = ip_address(u'0.0.0.0')
def one_net(subnets):
    """
    Get the one IP network that covers all subnets in input,
    or None is subnets are disjoint.
    """
    if len(subnets) == 0:
        return None

    minlen = min([net.prefixlen for net in subnets])
    while subnets.count(subnets[0]) < len(subnets) and minlen > 0:
        # all subnets are not (yet) equal
        subnets = [net.supernet(new_prefix=minlen) for net in subnets]
        minlen -= 1

    # 0.0.0.0/? -> no common subnet
    if subnets[0].network_address == ADDRESS_ANY:
        return None
    return subnets[0]
import ipaddr

ips = [ipaddr.IPv4Address(ip) for ip in ['10.10.10.0','10.10.11.0']]
ips = sorted(ips)
lowest_ip  = ips[0]  #first 
highest_ip = ips[-1] #last 
mask_length = ipaddr._get_prefix_length(int(lowest_ip), int(highest_ip), 
lowest_ip.max_prefixlen)
network_ip = ipaddr.IPNetwork("{}/{}".format(lowest_ip, mask_length)).network
network = ipaddr.IPNetwork("{}/{}".format(network_ip, mask_length), strict = True)
print (network)

$> 10.10.10.0/23