summaryrefslogtreecommitdiff
path: root/ipaddr.py
diff options
context:
space:
mode:
authorPeter Moody <pmoody@google.com>2009-11-02 19:25:53 +0000
committerPeter Moody <pmoody@google.com>2009-11-02 19:25:53 +0000
commitf02b322f7095218bec07354aec2e4b18c78e1569 (patch)
tree68fd10e365327fe9ed6fc016e71578600aa56be6 /ipaddr.py
parent9e6baffc6dd40b0bfc15b480e053554510bbf178 (diff)
downloadipaddr-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.py22
1 files changed, 14 insertions, 8 deletions
diff --git a/ipaddr.py b/ipaddr.py
index b395bc4..8b46200 100644
--- a/ipaddr.py
+++ b/ipaddr.py
@@ -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.