diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py --- a/Lib/ipaddress.py +++ b/Lib/ipaddress.py @@ -1517,6 +1517,8 @@ class IPv4Network(_BaseV4, _BaseNetwork): else: self.network_address = IPv4Address(packed & int(self.netmask)) + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ return # Assume input argument to be string or any object representation diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py +++ b/Lib/test/test_ipaddress.py @@ -1071,6 +1071,13 @@ class IpaddrUnitTest(unittest.TestCase): self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65) + def testYieldHostsFromSubnets(self): # issue 27683 + supernet = ipaddress.IPv4Network("172.0.0.4/30") + subnets = supernet.subnets(new_prefix=31) + sub = next(subnets) + expected = [ipaddress.IPv4Address("172.0.0.4"), ipaddress.IPv4Address("172.0.0.5")] + self.assertEqual(list(sub.hosts()), expected) + def testGetSubnetForSingle32(self): ip = ipaddress.IPv4Network('1.2.3.4/32') subnets1 = [str(x) for x in ip.subnets()]