diff -r 9cd9ab75eade -r 905f0261d3a4 Lib/_socket.py --- a/Lib/_socket.py Tue May 27 19:05:44 2014 +0000 +++ b/Lib/_socket.py Wed May 28 21:10:02 2014 -0700 @@ -1388,9 +1388,22 @@ # Define data structures to support IPV4 and IPV6. -# FIXME are these ip address classes required by CPython API? Must they be old-style classes? -class _ip_address_t: pass +class _ip_address_t(object): + + _address_tuple = None + + def __getitem__(self, index): + return self._address_tuple.__getitem__(index) + + def __len__(self): + return self._address_tuple.__len__() + + def __str__(self): + return self._address_tuple.__str__() + + def __repr__(self): + return self._address_tuple.__repr__() class _ipv4_address_t(_ip_address_t): @@ -1398,22 +1411,7 @@ self.sockaddr = sockaddr self.port = port self.jaddress = jaddress - - def __getitem__(self, index): - if 0 == index: - return self.sockaddr - elif 1 == index: - return self.port - else: - raise IndexError() - - def __len__(self): - return 2 - - def __str__(self): - return "('%s', %d)" % (self.sockaddr, self.port) - - __repr__ = __str__ + self._address_tuple = (sockaddr, port) class _ipv6_address_t(_ip_address_t): @@ -1421,27 +1419,7 @@ self.sockaddr = sockaddr self.port = port self.jaddress = jaddress - - def __getitem__(self, index): - if 0 == index: - return self.sockaddr - elif 1 == index: - return self.port - elif 2 == index: - return 0 - elif 3 == index: - return self.jaddress.scopeId - else: - raise IndexError() - - def __len__(self): - return 4 - - def __str__(self): - return "('%s', %d, 0, %d)" % (self.sockaddr, self.port, self.jaddress.scopeId) - - __repr__ = __str__ - + self._address_tuple = (sockaddr, port, 0, jaddress.scopeId) def _get_jsockaddr(address_object, family, sock_type, proto, flags): diff -r 9cd9ab75eade -r 905f0261d3a4 Lib/test/test_socket.py --- a/Lib/test/test_socket.py Tue May 27 19:05:44 2014 +0000 +++ b/Lib/test/test_socket.py Wed May 28 21:10:02 2014 -0700 @@ -1802,6 +1802,17 @@ self.assert_(isinstance(canonname, str)) self.assert_(isinstance(sockaddr[0], str)) + def testSockAddrAsTuple(self): + family, socktype, proto, canonname, sockaddr = socket.getaddrinfo(HOST, PORT, socket.AF_INET, socket.SOCK_STREAM)[0] + self.assertEqual(len(sockaddr), 2) + self.assertEqual(sockaddr[-1], PORT) + self.assertEqual(sockaddr[:2], ('127.0.0.1', PORT)) + + family, socktype, proto, canonname, sockaddr = socket.getaddrinfo('::1', PORT, socket.AF_INET6, socket.SOCK_STREAM)[0] + self.assertEqual(len(sockaddr), 4) + self.assertEqual(sockaddr[-3], PORT) + #self.assertEqual(sockaddr[:2], ('::1', PORT)) # FIXME: Got '0:0:...:1' instead! + def testAI_PASSIVE(self): # Disabling this test for now; it's expectations are not portable. # Expected results are too dependent on system config to be made portable between systems.