diff options
author | Peter Moody <pmoody@google.com> | 2009-11-02 19:25:53 +0000 |
---|---|---|
committer | Peter Moody <pmoody@google.com> | 2009-11-02 19:25:53 +0000 |
commit | f02b322f7095218bec07354aec2e4b18c78e1569 (patch) | |
tree | 68fd10e365327fe9ed6fc016e71578600aa56be6 /ipaddr.py | |
parent | 9e6baffc6dd40b0bfc15b480e053554510bbf178 (diff) | |
download | ipaddr-py-f02b322f7095218bec07354aec2e4b18c78e1569.tar.gz |
+ provide an iterator for looping through subnets. most useful
for *large* subnets, like v6 subnets.
patch by Marco Giutsi.
git-svn-id: https://ipaddr-py.googlecode.com/svn/trunk@124 09200d28-7f98-11dd-ad27-0f66e57d2035
Diffstat (limited to 'ipaddr.py')
-rw-r--r-- | ipaddr.py | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -867,11 +867,12 @@ class _BaseNet(_IPAddrBase): prefixlen = self._prefixlen return self._string_from_ip_int(self._ip_int_from_prefix(prefixlen)) - def subnet(self, prefixlen_diff=1, new_prefix=None): + def iter_subnets(self, prefixlen_diff=1, new_prefix=None): """The subnets which join to make the current subnet. In the case that self contains only one IP - (self._prefixlen == 32), return a list with just ourself. + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), return a list with just ourself. Args: prefixlen_diff: An integer, the amount the prefix length @@ -882,7 +883,7 @@ class _BaseNet(_IPAddrBase): This should not be set if prefixlen_diff is also set. Returns: - A list of IPv6 objects. + An iterator of IPv(4|6) objects. Raises: PrefixlenDiffInvalidError: The prefixlen_diff is too small @@ -893,7 +894,8 @@ class _BaseNet(_IPAddrBase): """ if self._prefixlen == self._max_prefixlen: - return [self] + yield self + return if new_prefix is not None: if new_prefix < self._prefixlen: @@ -914,18 +916,22 @@ class _BaseNet(_IPAddrBase): first = IPNetwork('%s/%s' % (str(self.network), str(self._prefixlen + prefixlen_diff)), version=self._version) - subnets = [first] + + yield first current = first while True: broadcast = current.broadcast if broadcast == self.broadcast: - break + return new_addr = IPAddress(int(broadcast) + 1, version=self._version) current = IPNetwork('%s/%s' % (str(new_addr), str(new_prefixlen)), version=self._version) - subnets.append(current) - return subnets + yield current + + def subnet(self, prefixlen_diff=1, new_prefix=None): + """Return a list of subnets, rather than an interator.""" + return list(self.iter_subnets(prefixlen_diff, new_prefix)) def supernet(self, prefixlen_diff=1, new_prefix=None): """The supernet containing the current network. |