[mypyc] Support __pow__, __rpow__, and __ipow__ dunders#14616
Merged
JukkaL merged 2 commits intopython:masterfrom Feb 16, 2023
Merged
[mypyc] Support __pow__, __rpow__, and __ipow__ dunders#14616JukkaL merged 2 commits intopython:masterfrom
JukkaL merged 2 commits intopython:masterfrom
Conversation
Unlike every other slot, power slots are ternary. Lots of special casing had to be done in generate_bin_op_wrapper() to support the third slot argument. - Ternary pow() does NOT fallback to __rpow__ if __pow__ returns NotImplemented unlike binary ops. - Ternary pow() does NOT try the right operand's __rpow__ first if it's a subclass of the left operand and redefines __rpow__ unlike binary ops. Add in the fact it's allowed and common to only define __(r|i)pow__ to take two arguments and you get a mess of a patch...
2 tasks
JukkaL
approved these changes
Feb 16, 2023
Collaborator
JukkaL
left a comment
There was a problem hiding this comment.
Looks good, thanks for considering all cases carefully. This was tricky! These are some of the most important remaining dunders that we need to support.
| """ | ||
| gen = WrapperGenerator(cl, emitter) | ||
| gen.set_target(fn) | ||
| assert len(fn.args) in (2, 3), "__ipow__ should only take 2 or 3 arguments" |
Collaborator
There was a problem hiding this comment.
The number of arguments accepted by dunders mostly isn't checked by mypy or mypyc, so it looks like we can actually trip the assertion -- but that's a more general problem and doesn't need to be addressed now (mypyc/mypyc#949).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Unlike every other slot, power slots are ternary. Some special casing had to be done in generate_bin_op_wrapper() to support the third slot argument. Annoyingly, pow() also has these unique behaviours:
__rpow__if__pow__returnsNotImplementedunlike binary ops.__rpow__first if it's a subclass of the left operand and redefines__rpow__unlike binary ops.Add in the fact it's allowed and common to only define
__(r|i)pow__to take two arguments (actually mypy won't let you define__rpow__to take three arguments) and the patch becomes frustratingly non-trivial.Towards mypyc/mypyc#553. Fixes mypyc/mypyc#907.