replace DummyMod with a more robust ModuleType that supports a custom user_ns #14754
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.
What changes are proposed in this pull request?
Some IPython apps, such as the one used in Databricks, need to seed the shell with a custom user namespace before it is actually created. This means the main module used by ipython can’t be a normal ModuleType (which doesn’t support overwriting dict) but instead a custom “DummyMod”. DummyMod isn’t considered an instance of ModuleType, which can mess up tools like ipytest + pytest -- see, for example, pytest-dev/pytest#12965.
To fix, in this PR we create a helper function that generates a
ModuleTypesubclass on-the-fly and that uses the user namespace provided a priori as its__dict__. Note thatModuleType.__dict__is read-only, which is probably why IPython originally created DummyMod. To get around that, we create a__dict__property and use custom getters / setters to delegate to the user_ns we pass in.Searching around, it seems like
DummyMod/FakeModulemay have caused some pain points in the past, e.g. around pickling (#384, #112) -- still trying to determine if this change can help with that.How is this tested?
Manual + pre-merge