Kaydet (Commit) 4f09806e authored tarafından R David Murray's avatar R David Murray

#25485: Add context manager support to Telnet class.

Patch by Stéphane Wirtel.
üst 37f54219
...@@ -43,6 +43,17 @@ Character), EL (Erase Line), GA (Go Ahead), SB (Subnegotiation Begin). ...@@ -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::
......
...@@ -125,6 +125,13 @@ Previously, names of properties and slots which were not yet created on ...@@ -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
------------------ ------------------
......
...@@ -637,6 +637,12 @@ class Telnet: ...@@ -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(): ...@@ -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()
...@@ -42,6 +42,11 @@ class GeneralTests(TestCase): ...@@ -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)
......
...@@ -10,6 +10,8 @@ Release date: XXXX-XX-XX ...@@ -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__.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment