[Python-checkins] cpython: Issue #14814: document the Interface APIs and fix various problems with the

nick.coghlan python-checkins at python.org
Mon Aug 20 02:04:45 CEST 2012


http://hg.python.org/cpython/rev/258558e36d8a
changeset: 78661:258558e36d8a
parent: 78659:4feb10457c13
user: Nick Coghlan <ncoghlan at gmail.com>
date: Mon Aug 20 10:04:26 2012 +1000
summary:
 Issue #14814: document the Interface APIs and fix various problems with the string representations (initial patch by Eli Bendersky).
files:
 Doc/library/ipaddress.rst | 77 +++++++++++++++++++------
 Lib/ipaddress.py | 9 ++-
 Lib/test/test_ipaddress.py | 16 ++---
 3 files changed, 72 insertions(+), 30 deletions(-)
diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst
--- a/Doc/library/ipaddress.rst
+++ b/Doc/library/ipaddress.rst
@@ -642,32 +642,73 @@
 
 .. class:: IPv4Interface(address)
 
- Construct an IPv4 interface. *address* is a string or integer representing
- the IP interface. An :exc:`AddressValueError` is raised if *address* is not
- a valid IPv4 address.
+ Construct an IPv4 interface. The meaning of *address* is as in the
+ constructor of :class:`IPv4Network`, except that arbitrary host addresses
+ are always accepted.
 
- The network address for the interface is determined by calling
- ``IPv4Network(address, strict=False)``.
+ :class:`IPv4Interface` is a subclass of :class:`IPv4Address`, so it inherits
+ all the attributes from that class. In addition, the following attributes
+ are available:
 
- >>> ipaddress.IPv4Interface('192.168.0.0/24')
- IPv4Interface('192.168.0.0/24')
- >>> ipaddress.IPv4Interface('192.168.0.0/24').network
- IPv4Network('192.168.0.0/24')
+ .. attribute:: ip
+
+ The address (:class:`IPv4Address`) without network information.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.ip
+ IPv4Address('192.0.2.5')
+
+ .. attribute:: network
+
+ The network (:class:`IPv4Network`) this interface belongs to.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.network
+ IPv4Network('192.0.2.0/24')
+
+ .. attribute:: with_prefixlen
+
+ A string representation of the interface with the mask in prefix notation.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.with_prefixlen
+ '192.0.2.5/24'
+
+ .. attribute:: with_netmask
+
+ A string representation of the interface with the network as a net mask.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.with_netmask
+ '192.0.2.5/255.255.255.0'
+
+ .. attribute:: with_hostmask
+
+ A string representation of the interface with the network as a host mask.
+
+ >>> interface = IPv4Interface('192.0.2.5/24')
+ >>> interface.with_hostmask
+ '192.0.2.5/0.0.0.255'
 
 
 .. class:: IPv6Interface(address)
 
- Construct an IPv6 interface. *address* is a string or integer representing
- the IP interface. An :exc:`AddressValueError` is raised if *address* is not
- a valid IPv6 address.
+ Construct an IPv6 interface. The meaning of *address* is as in the
+ constructor of :class:`IPv6Network`, except that arbitrary host addresses
+ are always accepted.
 
- The network address for the interface is determined by calling
- ``IPv6Network(address, strict=False)``.
+ :class:`IPv6Interface` is a subclass of :class:`IPv6Address`, so it inherits
+ all the attributes from that class. In addition, the following attributes
+ are available:
 
- >>> ipaddress.IPv6Interface('2001:db8::1000/96')
- IPv6Interface('2001:db8::1000/96')
- >>> ipaddress.IPv6Interface('2001:db8::1000/96').network
- IPv6Network('2001:db8::/96')
+ .. attribute:: ip
+ .. attribute:: network
+ .. attribute:: with_prefixlen
+ .. attribute:: with_netmask
+ .. attribute:: with_hostmask
+
+ Refer to the corresponding attribute documentation in
+ :class:`IPv4Interface`.
 
 
 Other Module Level Functions
diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -1336,7 +1336,8 @@
 
 @property
 def with_prefixlen(self):
- return self
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self._prefixlen)
 
 @property
 def with_netmask(self):
@@ -1948,11 +1949,13 @@
 
 @property
 def with_prefixlen(self):
- return self
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self._prefixlen)
 
 @property
 def with_netmask(self):
- return self.with_prefixlen
+ return '%s/%s' % (self._string_from_ip_int(self._ip),
+ self.netmask)
 
 @property
 def with_hostmask(self):
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
@@ -1558,21 +1558,19 @@
 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
 
 def testWithStar(self):
- self.assertEqual(str(self.ipv4_interface.with_prefixlen), "1.2.3.4/24")
- self.assertEqual(str(self.ipv4_interface.with_netmask),
+ self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
+ self.assertEqual(self.ipv4_interface.with_netmask,
 "1.2.3.4/255.255.255.0")
- self.assertEqual(str(self.ipv4_interface.with_hostmask),
+ self.assertEqual(self.ipv4_interface.with_hostmask,
 "1.2.3.4/0.0.0.255")
 
- self.assertEqual(str(self.ipv6_interface.with_prefixlen),
+ self.assertEqual(self.ipv6_interface.with_prefixlen,
 '2001:658:22a:cafe:200::1/64')
- # rfc3513 sec 2.3 says that ipv6 only uses cidr notation for
- # subnets
- self.assertEqual(str(self.ipv6_interface.with_netmask),
- '2001:658:22a:cafe:200::1/64')
+ self.assertEqual(self.ipv6_interface.with_netmask,
+ '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
 # this probably don't make much sense, but it's included for
 # compatibility with ipv4
- self.assertEqual(str(self.ipv6_interface.with_hostmask),
+ self.assertEqual(self.ipv6_interface.with_hostmask,
 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
 
 def testNetworkElementCaching(self):
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /