gh-153888: autospec doesn't work with lazy-imported symbols - #153977
Closed
palakkhinvasara wants to merge 11 commits into
Closed
palakkhinvasara wants to merge 11 commits into
palakkhinvasara wants to merge 11 commits into
Conversation
Contributor
Author
|
hello @cjw296 , can you pls review this pr? Thanks & Regards |
| builtin_string = 'builtins' | ||
|
|
||
| PTModule = sys.modules[__name__] | ||
| lazy from json import dumps as lazy_dumps # noqa: F401 |
Member
There was a problem hiding this comment.
Why is this import here?
| original = getattr(target, name, DEFAULT) | ||
| else: | ||
| local = True | ||
| local = True |
Member
There was a problem hiding this comment.
The indentation looks off.
palakkhinvasara
force-pushed
the
fix-unittest-lazy-import-patch
branch
from
July 20, 2026 12:55
0bcfebb to
59a848a
Compare
brittanyrey
reviewed
Aug 24, 2026
Comment on lines
+1474
to
+1475
| if isinstance(original, types.LazyImportType): | ||
| original = original.resolve() |
Contributor
There was a problem hiding this comment.
The indentation looks off here as well
| @@ -0,0 +1,2 @@ | |||
| Fix :func:`unittest.mock.patch` with ``autospec``, ``spec``, or ``spec_set`` | |||
Contributor
There was a problem hiding this comment.
The news entry mentions that your change fixes calls using autospec, spec, and spec_set, but only autospec is actually tested. Would you mind providing additional tests for the two other use cases as well?
brittanyrey
added a commit
to brittanyrey/cpython
that referenced
this pull request
Sep 18, 2026
unittest.mock.patch() reads the attribute it replaces out of target.__dict__, which for an unresolved lazy import holds a types.LazyImportType placeholder. spec=True, spec_set=True and autospec=True then specced the placeholder, so patching a function produced a NonCallableMagicMock. Reimplementation of python#153977, open since July 2026: - Resolve in _patch.__enter__(), and only when the spec is taken from the original, rather than unconditionally in get_original(). Resolving on every patch() breaks patch("mod.dep", new=...) for a lazy import of a module that is not installed. - Test spec and spec_set as well as autospec, as asked for in review. - Build the lazy binding in the test instead of importing json lazily at module level: "lazy from" binds eagerly when the module is already imported, so that test passed without the fix too. Reported as pythongh-153888.
encukou
pushed a commit
that referenced
this pull request
Sep 29, 2026
…157768) Resolve lazy imports before using them as a mock spec unittest.mock.patch() reads the attribute it replaces out of target.__dict__, which for an unresolved lazy import holds a types.LazyImportType placeholder. spec=True, spec_set=True and autospec=True then specced the placeholder, so patching a function produced a NonCallableMagicMock. Reimplementation of #153977: - Resolve in _patch.__enter__(), and only when the spec is taken from the original, rather than unconditionally in get_original(). Resolving on every patch() breaks patch("mod.dep", new=...) for a lazy import of a module that is not installed. - Test spec and spec_set as well as autospec, as asked for in review. - Build the lazy binding in the test instead of importing json lazily at module level: "lazy from" binds eagerly when the module is already imported, so that test passed without the fix too.
Member
|
Fixed in #157768. |
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.
#153888 Fix
unittest.mock.patchwith lazy imports and autospecunittest.mock.patch()currently reads unresolved lazy-import bindings directly fromtarget.__dict__.When
autospec=True(and similarlyspec/spec_set) is used with a lazy-imported object,patch()receives theLazyImportTypeproxy instead of the actual imported object. This causescreate_autospec()to create aNonCallableMagicMockfor callable objects.For example: