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

the same values as open().
This commit is contained in:
Berker Peksag 2016-02-18 17:34:00 +02:00
parent c12fef9aa3
commit 3fe64d0c5c
3 changed files with 19 additions and 4 deletions

View File

@ -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

View File

@ -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

View File

@ -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: