copy and deepcopy functionality for metaclasses #10903
Closed
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.
This change allows metaclasses to provide the same copying/deepcopying functionality for class objects that class objects can provide for instance objects. As a concrete example of where this is useful, consider the following:
If I take the above code, and I run:
This is already somewhat surprising. Compare it to the analogous code for an instance:
Which gives us
Even accepting this as the default state of affairs, it is quite upsetting that we cannot make a
__deepcopy__
implementation for our metaclass that will override this default behavior in the case that we have a classmember that we need to copy. Imagine e.g:I think one could reasonably expect this implementation to fix our initial problem. However, since class objects are explicitly ignored by the deepcopy and copy implementations, it does not.
Since
__reduce_ex__
,__reduce__
,__deepcopy__
and__copy__
implementations have no effect on copy currently I think it's reasonable to assume there will be no implementations of these methods on existing metaclasses. To preserve the null behavior on class objects without metaclasses that implement these methods I've added an explicit check for class objects if these methods are all missing.