Issue #16915: Clarify that mode parameter of socket.makefile() does not accept
the same values as open().
This commit is contained in:
parent
c12fef9aa3
commit
3fe64d0c5c
|
@ -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):
|
||||||
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):
|
||||||
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:
|
||||||
|
|
Loading…
Reference in New Issue