Commit 3fe64d0c authored by Berker Peksag's avatar Berker Peksag

Issue #16915: Clarify that mode parameter of socket.makefile() does not accept

the same values as open().
parent c12fef9a
...@@ -1006,7 +1006,8 @@ to sockets. ...@@ -1006,7 +1006,8 @@ to sockets.
Return a :term:`file object` associated with the socket. The exact returned Return a :term:`file object` associated with the socket. The exact returned
type depends on the arguments given to :meth:`makefile`. These arguments are type depends on the arguments given to :meth:`makefile`. These arguments are
interpreted the same way as by the built-in :func:`open` function. interpreted the same way as by the built-in :func:`open` function, except
the only supported *mode* values are ``'r'`` (default), ``'w'`` and ``'b'``.
The socket must be in blocking mode; it can have a timeout, but the file The socket must be in blocking mode; it can have a timeout, but the file
object's internal buffer may end up in an inconsistent state if a timeout object's internal buffer may end up in an inconsistent state if a timeout
......
...@@ -209,10 +209,10 @@ class socket(_socket.socket): ...@@ -209,10 +209,10 @@ class socket(_socket.socket):
encoding=None, errors=None, newline=None): encoding=None, errors=None, newline=None):
"""makefile(...) -> an I/O stream connected to the socket """makefile(...) -> an I/O stream connected to the socket
The arguments are as for io.open() after the filename, The arguments are as for io.open() after the filename, except the only
except the only mode characters supported are 'r', 'w' and 'b'. supported mode values are 'r' (default), 'w' and 'b'.
The semantics are similar too. (XXX refactor to share code?)
""" """
# XXX refactor to share code?
if not set(mode) <= {"r", "w", "b"}: if not set(mode) <= {"r", "w", "b"}:
raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,))
writing = "w" in mode writing = "w" in mode
......
...@@ -1374,6 +1374,20 @@ class GeneralModuleTests(unittest.TestCase): ...@@ -1374,6 +1374,20 @@ class GeneralModuleTests(unittest.TestCase):
self.assertRaises(ValueError, fp.writable) self.assertRaises(ValueError, fp.writable)
self.assertRaises(ValueError, fp.seekable) self.assertRaises(ValueError, fp.seekable)
def test_makefile_mode(self):
for mode in 'r', 'rb', 'rw', 'w', 'wb':
with self.subTest(mode=mode):
with socket.socket() as sock:
with sock.makefile(mode) as fp:
self.assertEqual(fp.mode, mode)
def test_makefile_invalid_mode(self):
for mode in 'rt', 'x', '+', 'a':
with self.subTest(mode=mode):
with socket.socket() as sock:
with self.assertRaisesRegex(ValueError, 'invalid mode'):
sock.makefile(mode)
def test_pickle(self): def test_pickle(self):
sock = socket.socket() sock = socket.socket()
with sock: with sock:
......
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