-
-
Notifications
You must be signed in to change notification settings - Fork 31.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-32034: Make asyncio.IncompleteReadError pickleable. #4409
Conversation
I think this would deserve backporting as well. |
@@ -845,6 +846,13 @@ def test___repr__transport(self): | |||
stream._transport.__repr__.return_value = "<Transport>" | |||
self.assertEqual("<StreamReader t=<Transport>>", repr(stream)) | |||
|
|||
def test_IncompleteReadError_pickleable(self): | |||
e = asyncio.IncompleteReadError(b'abc', 10) | |||
e2 = pickle.loads(pickle.dumps(e)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Test with all supported protocols.
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
@@ -35,6 +35,9 @@ def __init__(self, partial, expected): | |||
self.partial = partial | |||
self.expected = expected | |||
|
|||
def __reduce__(self): | |||
return type(self), (self.partial, self.expected) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is other problem with this solution -- it loses all additional attributes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
asyncio doesn't set any additional attributes, so I think it's OK
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if somebody will create a subclass?
Adding self.__dict__
as the third component will save all attributes. But not slots.
bpo-26579 could help to support general cases. But pickling exceptions is a headache in any case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if somebody will create a subclass?
Well, they then can handle pickling on their own. I mean in asyncio we control both exceptions and don't subclass them. If someone outside of asyncio decides to subclass or otherwise reuse these exceptions, it's entirely up to them.
I don't want to introduce any extra overhead here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then everything is fine. Except misleading repr, but this is another story.
@Mariatta Not sure what's going on with this PR, but bedevere-bot keeps closing it whenever I push a commit... |
I wonder why exceptions need special care at all to be picklable. |
Due to |
Can |
@@ -35,6 +35,9 @@ def __init__(self, partial, expected): | |||
self.partial = partial | |||
self.expected = expected | |||
|
|||
def __reduce__(self): | |||
return type(self), (self.partial, self.expected) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then everything is fine. Except misleading repr, but this is another story.
Maybe it can be improved (bpo-26579 can slightly help here). But this perhaps needs fixing BaseException constructors and other methods. |
Thanks @1st1 for the PR 🌮🎉.. I'm working now to backport this PR to: 3.6. |
…thonGH-4409 (cherry picked from commit 43605e6)
Thanks, Serhiy! |
@1S1 I'm so sorry! It's my fault.. The PR was closed because of this change to bedevere earlier today. 😞 I'll get that fixed ASAP |
@Mariatta it's not a problem at all! I just wanted you to know that there's some kind of bug here, that's all. Thanks for looking into this! |
Things don't seem to work well today :( |
* 'master' of https://github.com/python/cpython: (550 commits) bpo-31867: Remove duplicates in default mimetypes. (python#4388) tokenizer: Remove unused tabs options (python#4422) bpo-31691: Specify where to find build instructions for the Windows installer (python#4426) Fix typo in atexit documentation. (pythonGH-4419) bpo-31702: Allow to specify rounds for SHA-2 hashing in crypt.mksalt(). (python#4110) bpo-32043: New "developer mode": "-X dev" option (python#4413) bpo-30349: Raise FutureWarning for nested sets and set operations (python#1553) bpo-32037: Use the INT opcode for 32-bit integers in protocol 0 pickles. (python#4407) bpo-30143: 2to3 now generates a code that uses abstract collection classes (python#1262) bpo-32030: Enhance Py_Main() (python#4412) bpo-32030: Split Py_Main() into subfunctions (python#4399) bpo-32034: Make IncompleteReadError & LimitOverrunError pickleable python#4409 bpo-32025: Add time.thread_time() (python#4410) bpo-32018: Fix inspect.signature repr to follow PEP 8 (python#4408) bpo-30399: Get rid of trailing comma in the repr of BaseException. (python#1650) bpo-30950: Convert round() to Argument Clinic. (python#2740) bpo-32011: Revert "Issue python#15480: Remove the deprecated and unused TYPE_INT64 code from marshal." (python#4381) bpo-32023: Disallow genexprs without parenthesis in class definitions. (python#4400) bpo-31949: Fixed several issues in printing tracebacks (PyTraceBack_Print()). (python#4289) bpo-32032: Test both implementations of module-level pickle API. (python#4401) ...
https://bugs.python.org/issue32034