diff options
author | Yury Selivanov <yury@magic.io> | 2017-11-15 17:14:28 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-15 17:14:28 -0500 |
commit | 43605e6bfa8d49612df4a38460d063d6ba781906 (patch) | |
tree | fb35c0febdb3b6b388b9c4eb6fabec0b7f1f861c | |
parent | 4bd41c9b52ea0c730e9e294caaf003e54c088c6e (diff) | |
download | cpython-git-43605e6bfa8d49612df4a38460d063d6ba781906.tar.gz |
bpo-32034: Make IncompleteReadError & LimitOverrunError pickleable #4409
-rw-r--r-- | Lib/asyncio/streams.py | 6 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_streams.py | 18 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst | 1 |
3 files changed, 25 insertions, 0 deletions
diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 9fda853768..30b751e989 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -35,6 +35,9 @@ class IncompleteReadError(EOFError): self.partial = partial self.expected = expected + def __reduce__(self): + return type(self), (self.partial, self.expected) + class LimitOverrunError(Exception): """Reached the buffer limit while looking for a separator. @@ -46,6 +49,9 @@ class LimitOverrunError(Exception): super().__init__(message) self.consumed = consumed + def __reduce__(self): + return type(self), (self.args[0], self.consumed) + @coroutine def open_connection(host=None, port=None, *, diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index b47433a4cf..6d16d20079 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -3,6 +3,7 @@ import gc import os import queue +import pickle import socket import sys import threading @@ -845,6 +846,23 @@ os.close(fd) stream._transport.__repr__.return_value = "<Transport>" self.assertEqual("<StreamReader t=<Transport>>", repr(stream)) + def test_IncompleteReadError_pickleable(self): + e = asyncio.IncompleteReadError(b'abc', 10) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(pickle_protocol=proto): + e2 = pickle.loads(pickle.dumps(e, protocol=proto)) + self.assertEqual(str(e), str(e2)) + self.assertEqual(e.partial, e2.partial) + self.assertEqual(e.expected, e2.expected) + + def test_LimitOverrunError_pickleable(self): + e = asyncio.LimitOverrunError('message', 10) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(pickle_protocol=proto): + e2 = pickle.loads(pickle.dumps(e, protocol=proto)) + self.assertEqual(str(e), str(e2)) + self.assertEqual(e.consumed, e2.consumed) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst b/Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst new file mode 100644 index 0000000000..828e8cde57 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst @@ -0,0 +1 @@ +Make asyncio.IncompleteReadError and LimitOverrunError pickleable. |