changeset: 99380:277824f2d133 parent: 99377:9fcfdb53e8af user: R David Murray date: Sat Nov 28 12:24:52 2015 -0500 files: Doc/library/telnetlib.rst Doc/whatsnew/3.6.rst Lib/telnetlib.py Lib/test/test_telnetlib.py Misc/NEWS description: #25485: Add context manager support to Telnet class. Patch by Stéphane Wirtel. diff -r 9fcfdb53e8af -r 277824f2d133 Doc/library/telnetlib.rst --- a/Doc/library/telnetlib.rst Thu Nov 26 23:52:34 2015 +0200 +++ b/Doc/library/telnetlib.rst Sat Nov 28 12:24:52 2015 -0500 @@ -43,6 +43,17 @@ :exc:`EOFError` when the end of the connection is read, because they can return an empty string for other reasons. See the individual descriptions below. + A :class:`Telnet` object is a context manager and can be used in a + :keyword:`with` statement. When the :keyword:`with` block ends, the + :meth:`close` method is called:: + + >>> from telnetlib import Telnet + >>> with Telnet('localhost', 23) as tn: + ... tn.interact() + ... + + .. versionchanged:: 3.6 Context manager support added + .. seealso:: diff -r 9fcfdb53e8af -r 277824f2d133 Doc/whatsnew/3.6.rst --- a/Doc/whatsnew/3.6.rst Thu Nov 26 23:52:34 2015 +0200 +++ b/Doc/whatsnew/3.6.rst Sat Nov 28 12:24:52 2015 -0500 @@ -125,6 +125,13 @@ an instance were excluded. (Contributed by Martin Panter in :issue:`25590`.) +telnetlib +--------- + +:class:`~telnetlib.Telnet` is now a context manager (contributed by +Stéphane Wirtel in :issue:`25485`). + + urllib.robotparser ------------------ diff -r 9fcfdb53e8af -r 277824f2d133 Lib/telnetlib.py --- a/Lib/telnetlib.py Thu Nov 26 23:52:34 2015 +0200 +++ b/Lib/telnetlib.py Sat Nov 28 12:24:52 2015 -0500 @@ -637,6 +637,12 @@ raise EOFError return (-1, None, text) + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + def test(): """Test program for telnetlib. @@ -660,11 +666,10 @@ port = int(portstr) except ValueError: port = socket.getservbyname(portstr, 'tcp') - tn = Telnet() - tn.set_debuglevel(debuglevel) - tn.open(host, port, timeout=0.5) - tn.interact() - tn.close() + with Telnet() as tn: + tn.set_debuglevel(debuglevel) + tn.open(host, port, timeout=0.5) + tn.interact() if __name__ == '__main__': test() diff -r 9fcfdb53e8af -r 277824f2d133 Lib/test/test_telnetlib.py --- a/Lib/test/test_telnetlib.py Thu Nov 26 23:52:34 2015 +0200 +++ b/Lib/test/test_telnetlib.py Sat Nov 28 12:24:52 2015 -0500 @@ -42,6 +42,11 @@ telnet = telnetlib.Telnet(HOST, self.port) telnet.sock.close() + def testContextManager(self): + with telnetlib.Telnet(HOST, self.port) as tn: + self.assertIsNotNone(tn.get_socket()) + self.assertIsNone(tn.get_socket()) + def testTimeoutDefault(self): self.assertTrue(socket.getdefaulttimeout() is None) socket.setdefaulttimeout(30) diff -r 9fcfdb53e8af -r 277824f2d133 Misc/NEWS --- a/Misc/NEWS Thu Nov 26 23:52:34 2015 +0200 +++ b/Misc/NEWS Sat Nov 28 12:24:52 2015 -0500 @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #25485: telnetlib.Telnet is now a context manager. + - Issue #24097: Fixed crash in object.__reduce__() if slot name is freed inside __getattr__.