Skip to content

Commit f35076a

Browse files
miss-islington1st1
authored andcommitted
bpo-32034: Make IncompleteReadError & LimitOverrunError pickleable GH-4409 (#4411)
(cherry picked from commit 43605e6)
1 parent d15bb5f commit f35076a

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

Lib/asyncio/streams.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ def __init__(self, partial, expected):
3535
self.partial = partial
3636
self.expected = expected
3737

38+
def __reduce__(self):
39+
return type(self), (self.partial, self.expected)
40+
3841

3942
class LimitOverrunError(Exception):
4043
"""Reached the buffer limit while looking for a separator.
@@ -46,6 +49,9 @@ def __init__(self, message, consumed):
4649
super().__init__(message)
4750
self.consumed = consumed
4851

52+
def __reduce__(self):
53+
return type(self), (self.args[0], self.consumed)
54+
4955

5056
@coroutine
5157
def open_connection(host=None, port=None, *,

Lib/test/test_asyncio/test_streams.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import gc
44
import os
55
import queue
6+
import pickle
67
import socket
78
import sys
89
import threading
@@ -845,6 +846,23 @@ def test___repr__transport(self):
845846
stream._transport.__repr__.return_value = "<Transport>"
846847
self.assertEqual("<StreamReader t=<Transport>>", repr(stream))
847848

849+
def test_IncompleteReadError_pickleable(self):
850+
e = asyncio.IncompleteReadError(b'abc', 10)
851+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
852+
with self.subTest(pickle_protocol=proto):
853+
e2 = pickle.loads(pickle.dumps(e, protocol=proto))
854+
self.assertEqual(str(e), str(e2))
855+
self.assertEqual(e.partial, e2.partial)
856+
self.assertEqual(e.expected, e2.expected)
857+
858+
def test_LimitOverrunError_pickleable(self):
859+
e = asyncio.LimitOverrunError('message', 10)
860+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
861+
with self.subTest(pickle_protocol=proto):
862+
e2 = pickle.loads(pickle.dumps(e, protocol=proto))
863+
self.assertEqual(str(e), str(e2))
864+
self.assertEqual(e.consumed, e2.consumed)
865+
848866

849867
if __name__ == '__main__':
850868
unittest.main()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Make asyncio.IncompleteReadError and LimitOverrunError pickleable.

0 commit comments

Comments
 (0)