Skip to content

[3.15] gh-153888: Resolve lazy imports before using them as a mock spec (GH-157768) - #158396

Open
miss-islington wants to merge 1 commit into
python:3.15from
miss-islington:backport-cac0167-3.15
Open

miss-islington wants to merge 1 commit into
python:3.15from
miss-islington:backport-cac0167-3.15

Conversation

@miss-islington

@miss-islington miss-islington commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

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.
    (cherry picked from commit cac0167)

Co-authored-by: Brittany Reynoso breynoso@meta.com

pythonGH-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 python#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.
(cherry picked from commit cac0167)

Co-authored-by: Brittany Reynoso <breynoso@meta.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants