@@ -310,7 +310,7 @@ def collapse_addresses(addresses):
310
310
[IPv4Network('192.0.2.0/24')]
311
311
312
312
Args:
313
- addresses: An iterator of IPv4Network or IPv6Network objects.
313
+ addresses: An iterable of IPv4Network or IPv6Network objects.
314
314
315
315
Returns:
316
316
An iterator of the collapsed IPv(4|6)Network objects.
@@ -1840,9 +1840,6 @@ def _string_from_ip_int(cls, ip_int=None):
1840
1840
def _explode_shorthand_ip_string (self ):
1841
1841
"""Expand a shortened IPv6 address.
1842
1842
1843
- Args:
1844
- ip_str: A string, the IPv6 address.
1845
-
1846
1843
Returns:
1847
1844
A string, the expanded IPv6 address.
1848
1845
@@ -1986,6 +1983,9 @@ def is_multicast(self):
1986
1983
See RFC 2373 2.7 for details.
1987
1984
1988
1985
"""
1986
+ ipv4_mapped = self .ipv4_mapped
1987
+ if ipv4_mapped is not None :
1988
+ return ipv4_mapped .is_multicast
1989
1989
return self in self ._constants ._multicast_network
1990
1990
1991
1991
@property
@@ -1997,6 +1997,9 @@ def is_reserved(self):
1997
1997
reserved IPv6 Network ranges.
1998
1998
1999
1999
"""
2000
+ ipv4_mapped = self .ipv4_mapped
2001
+ if ipv4_mapped is not None :
2002
+ return ipv4_mapped .is_reserved
2000
2003
return any (self in x for x in self ._constants ._reserved_networks )
2001
2004
2002
2005
@property
@@ -2007,6 +2010,9 @@ def is_link_local(self):
2007
2010
A boolean, True if the address is reserved per RFC 4291.
2008
2011
2009
2012
"""
2013
+ ipv4_mapped = self .ipv4_mapped
2014
+ if ipv4_mapped is not None :
2015
+ return ipv4_mapped .is_link_local
2010
2016
return self in self ._constants ._linklocal_network
2011
2017
2012
2018
@property
@@ -2063,6 +2069,9 @@ def is_global(self):
2063
2069
``is_global`` has value opposite to :attr:`is_private`, except for the ``100.64.0.0/10``
2064
2070
IPv4 range where they are both ``False``.
2065
2071
"""
2072
+ ipv4_mapped = self .ipv4_mapped
2073
+ if ipv4_mapped is not None :
2074
+ return ipv4_mapped .is_global
2066
2075
return not self .is_private
2067
2076
2068
2077
@property
@@ -2074,6 +2083,9 @@ def is_unspecified(self):
2074
2083
RFC 2373 2.5.2.
2075
2084
2076
2085
"""
2086
+ ipv4_mapped = self .ipv4_mapped
2087
+ if ipv4_mapped is not None :
2088
+ return ipv4_mapped .is_unspecified
2077
2089
return self ._ip == 0
2078
2090
2079
2091
@property
@@ -2085,6 +2097,9 @@ def is_loopback(self):
2085
2097
RFC 2373 2.5.3.
2086
2098
2087
2099
"""
2100
+ ipv4_mapped = self .ipv4_mapped
2101
+ if ipv4_mapped is not None :
2102
+ return ipv4_mapped .is_loopback
2088
2103
return self ._ip == 1
2089
2104
2090
2105
@property
@@ -2201,7 +2216,7 @@ def is_unspecified(self):
2201
2216
2202
2217
@property
2203
2218
def is_loopback (self ):
2204
- return self . _ip == 1 and self .network .is_loopback
2219
+ return super (). is_loopback and self .network .is_loopback
2205
2220
2206
2221
2207
2222
class IPv6Network (_BaseV6 , _BaseNetwork ):
@@ -2314,6 +2329,8 @@ class _IPv6Constants:
2314
2329
IPv6Network ('2001:db8::/32' ),
2315
2330
# IANA says N/A, let's consider it not globally reachable to be safe
2316
2331
IPv6Network ('2002::/16' ),
2332
+ # RFC 9637: https://www.rfc-editor.org/rfc/rfc9637.html#section-6-2.2
2333
+ IPv6Network ('3fff::/20' ),
2317
2334
IPv6Network ('fc00::/7' ),
2318
2335
IPv6Network ('fe80::/10' ),
2319
2336
]
0 commit comments