diff -r ece75a3b942c Lib/ipaddress.py --- a/Lib/ipaddress.py Wed Dec 05 17:59:29 2012 +0200 +++ b/Lib/ipaddress.py Thu Dec 06 20:47:48 2012 -0800 @@ -1291,6 +1291,18 @@ self._prefixlen = self._max_prefixlen return + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + addr = _split_optional_netmask(address) IPv4Address.__init__(self, addr[0]) @@ -1422,6 +1434,23 @@ #fixme: address/network test here. return + if isinstance(address, tuple): + self.network_address = IPv4Address(address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.netmask = IPv4Address(self._ip_int_from_prefix( + self._prefixlen)) + if strict: + if (IPv4Address(int(self.network_address) & + int(self.netmask)) != self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation # which converts into a formatted IP prefix string. addr = _split_optional_netmask(address) @@ -1904,6 +1933,16 @@ self.network = IPv6Network(self._ip) self._prefixlen = self._max_prefixlen return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return addr = _split_optional_netmask(address) IPv6Address.__init__(self, addr[0]) @@ -2035,6 +2074,22 @@ self.netmask = IPv6Address(self._ALL_ONES) return + if isinstance(address, tuple): + self.network_address = IPv6Address(address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.netmask = IPv6Address(self._ip_int_from_prefix( + self._prefixlen)) + if strict: + if (IPv6Address(int(self.network_address) & + int(self.netmask)) != self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + return + # Assume input argument to be string or any object representation # which converts into a formatted IP prefix string. addr = _split_optional_netmask(address) diff -r ece75a3b942c Lib/test/test_ipaddress.py --- a/Lib/test/test_ipaddress.py Wed Dec 05 17:59:29 2012 +0200 +++ b/Lib/test/test_ipaddress.py Thu Dec 06 20:47:48 2012 -0800 @@ -582,6 +582,29 @@ self.assertEqual("IPv6Interface('::1/128')", repr(ipaddress.IPv6Interface('::1'))) + def testIPv4Tuple(self): + self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', '32')), + ipaddress.IPv4Network('192.0.2.1/32')) + self.assertEqual(ipaddress.IPv4Network((3221225985, '32')), + ipaddress.IPv4Network('192.0.2.1/32')) + self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', '24')), + ipaddress.IPv4Interface('192.0.2.1/24')) + self.assertEqual(ipaddress.IPv4Interface((3221225985, '24')), + ipaddress.IPv4Interface('192.0.2.1/24')) + + def testIPv6Tuple(self): + self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')), + ipaddress.IPv6Network('2001:db8::/128')) + self.assertEqual(ipaddress.IPv6Network( + (42540766411282592856903984951653826560, '128')), + ipaddress.IPv6Network('2001:db8::/128')) + + self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')), + ipaddress.IPv6Interface('2001:db8::1/96')) + self.assertEqual(ipaddress.IPv6Interface( + (42540766411282592856903984951653826561, '96')), + ipaddress.IPv6Interface('2001:db8::1/96')) + # issue57 def testAddressIntMath(self): self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,