gh-121306: allow a mapping as __dict__ of object#121389
Open
Uh oh!
There was an error while loading. Please reload this page.
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 PR allows a mapping as the
__dict__attribute of an object. This was originally meant to allow a mapping to be passed as the globals argument toexecandeval, but for consistency the global namespace of a module should be allowed to be a mapping as well, and by extension the__dict__attribute of any object.Full backwards compatibility is maintained by adding a
PyDict_Check-guarded fast path to existingPyDict_*function calls with a fallback to theirPyMapping_*equivalent API calls. A unified dict/mapping API in the form of helper macros is introduced to avoid potential code clutter from adding such a conditional statement to everyPyDict_*call.Note that some
PyDict_*functions do not have directPyMapping_*equivalents so calls to those functions have to be switched to similar functions that do havePyMapping_*equivalents. These include:PyDict_Pop(dict, key, NULL)is replaced withPyDict_DelItem(dict, key); the former does not raiseKeyErrorwhile the latter does, so the caller has to handle error differently.PyDict_GetItemWithErroris replaced withPyDict_GetItemRef; the former returns a borrowed reference while the latter creates a new ref so the caller has to account for the new ref accordingly.Tests that expected
SystemErrororTypeErrorfrom a non-dict global namspace have been revised to reflect the new capability.execwith aChainMap) #121306