diff options
-rw-r--r-- | Lib/socket.py | 33 | ||||
-rw-r--r-- | Lib/test/test_socket.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 40 insertions, 9 deletions
diff --git a/Lib/socket.py b/Lib/socket.py index da0c39a..96f8ed0 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -103,13 +103,32 @@ class socket(_socket.socket): self.close() def __repr__(self): - """Wrap __repr__() to reveal the real class name.""" - s = _socket.socket.__repr__(self) - if s.startswith("<socket object"): - s = "<%s.%s%s%s" % (self.__class__.__module__, - self.__class__.__name__, - getattr(self, '_closed', False) and " [closed] " or "", - s[7:]) + """Wrap __repr__() to reveal the real class name and socket + address(es). + """ + closed = getattr(self, '_closed', False) + s = "<%s.%s%s fd=%i, family=%i, type=%i, proto=%i" \ + % (self.__class__.__module__, + self.__class__.__name__, + " [closed]" if closed else "", + self.fileno(), + self.family, + self.type, + self.proto) + if not closed: + try: + laddr = self.getsockname() + if laddr: + s += ", laddr=%s" % str(laddr) + except error: + pass + try: + raddr = self.getpeername() + if raddr: + s += ", raddr=%s" % str(raddr) + except error: + pass + s += '>' return s def __getstate__(self): diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index ec76671..9b6d184 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -652,8 +652,17 @@ class GeneralModuleTests(unittest.TestCase): def test_repr(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.addCleanup(s.close) - self.assertTrue(repr(s).startswith("<socket.socket object")) + with s: + self.assertIn('fd=%i' % s.fileno(), repr(s)) + self.assertIn('family=%i' % socket.AF_INET, repr(s)) + self.assertIn('type=%i' % socket.SOCK_STREAM, repr(s)) + self.assertIn('proto=0', repr(s)) + self.assertIn('laddr', repr(s)) + self.assertNotIn('raddr', repr(s)) + s.bind(('127.0.0.1', 0)) + self.assertIn(str(s.getsockname()), repr(s)) + self.assertIn('[closed]', repr(s)) + self.assertNotIn('laddr', repr(s)) def test_weakref(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -32,6 +32,9 @@ Core and Builtins Library ------- +- Issue #17675: socket repr() provides local and remote addresses (if any). + Patch by Giampaolo Rodola' + - Issue #17093: Make the ABCs in importlib.abc provide default values or raise reasonable exceptions for their methods to make them more amenable to super() calls. |