#25485: Add context manager support to Telnet class.

Patch by Stéphane Wirtel.
This commit is contained in:
R David Murray 2015-11-28 12:24:52 -05:00
parent 37f5421954
commit 4f09806e66
5 changed files with 35 additions and 5 deletions

View file

@ -43,6 +43,17 @@ Character), EL (Erase Line), GA (Go Ahead), SB (Subnegotiation Begin).
:exc:`EOFError` when the end of the connection is read, because they can return :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. 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:: .. seealso::

View file

@ -125,6 +125,13 @@ Previously, names of properties and slots which were not yet created on
an instance were excluded. (Contributed by Martin Panter in :issue:`25590`.) 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 urllib.robotparser
------------------ ------------------

View file

@ -637,6 +637,12 @@ class Telnet:
raise EOFError raise EOFError
return (-1, None, text) return (-1, None, text)
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
self.close()
def test(): def test():
"""Test program for telnetlib. """Test program for telnetlib.
@ -660,11 +666,10 @@ def test():
port = int(portstr) port = int(portstr)
except ValueError: except ValueError:
port = socket.getservbyname(portstr, 'tcp') port = socket.getservbyname(portstr, 'tcp')
tn = Telnet() with Telnet() as tn:
tn.set_debuglevel(debuglevel) tn.set_debuglevel(debuglevel)
tn.open(host, port, timeout=0.5) tn.open(host, port, timeout=0.5)
tn.interact() tn.interact()
tn.close()
if __name__ == '__main__': if __name__ == '__main__':
test() test()

View file

@ -42,6 +42,11 @@ class GeneralTests(TestCase):
telnet = telnetlib.Telnet(HOST, self.port) telnet = telnetlib.Telnet(HOST, self.port)
telnet.sock.close() 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): def testTimeoutDefault(self):
self.assertTrue(socket.getdefaulttimeout() is None) self.assertTrue(socket.getdefaulttimeout() is None)
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)

View file

@ -10,6 +10,8 @@ Release date: XXXX-XX-XX
Core and Builtins 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 - Issue #24097: Fixed crash in object.__reduce__() if slot name is freed inside
__getattr__. __getattr__.