summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2015-11-28 17:24:52 (GMT)
committerR David Murray <rdmurray@bitdance.com>2015-11-28 17:24:52 (GMT)
commit4f09806e662928c5524ab5d792d73297c50494b3 (patch)
tree74a8b786e7c43de01493bc1b84ad1e38367219c4
parent37f54219543f9cb6ebf6a94cfe1eb402bc9b5580 (diff)
downloadcpython-4f09806e662928c5524ab5d792d73297c50494b3.zip
cpython-4f09806e662928c5524ab5d792d73297c50494b3.tar.gz
cpython-4f09806e662928c5524ab5d792d73297c50494b3.tar.bz2
#25485: Add context manager support to Telnet class.
Patch by Stéphane Wirtel.
-rw-r--r--Doc/library/telnetlib.rst11
-rw-r--r--Doc/whatsnew/3.6.rst7
-rw-r--r--Lib/telnetlib.py15
-rw-r--r--Lib/test/test_telnetlib.py5
-rw-r--r--Misc/NEWS2
5 files changed, 35 insertions, 5 deletions
diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst
index 4040f72..ce406ca 100644
--- a/Doc/library/telnetlib.rst
+++ b/Doc/library/telnetlib.rst
@@ -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
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 --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
index 172b253..fc32fb5 100644
--- a/Doc/whatsnew/3.6.rst
+++ b/Doc/whatsnew/3.6.rst
@@ -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`.)
+telnetlib
+---------
+
+:class:`~telnetlib.Telnet` is now a context manager (contributed by
+Stéphane Wirtel in :issue:`25485`).
+
+
urllib.robotparser
------------------
diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
index 72dabc7..b0863b1 100644
--- a/Lib/telnetlib.py
+++ b/Lib/telnetlib.py
@@ -637,6 +637,12 @@ class Telnet:
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 @@ def test():
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 --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py
index 524bba3..23029e0 100644
--- a/Lib/test/test_telnetlib.py
+++ b/Lib/test/test_telnetlib.py
@@ -42,6 +42,11 @@ class GeneralTests(TestCase):
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 --git a/Misc/NEWS b/Misc/NEWS
index c3cce96..2cb06e9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ Release date: XXXX-XX-XX
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__.