Skip to content

Start moving away from named_type callback architecture#21201

Merged
ilevkivskyi merged 3 commits intopython:masterfrom
ilevkivskyi:less-named-type
Apr 13, 2026
Merged

Start moving away from named_type callback architecture#21201
ilevkivskyi merged 3 commits intopython:masterfrom
ilevkivskyi:less-named-type

Conversation

@ilevkivskyi
Copy link
Copy Markdown
Member

This is a follow-up for #21170

Now that we have modules available as part of the global state (for the purposes of lazy deserialization), I propose to gradually move away from (IMO awkward) architecture where we pass around a lot of named_type callbacks, and instead use:

  • A library of lookup functions (we already started migrating lookup functions to lookup.py)
  • And the newly added global modules state

I am not sure yet what is the best way to use instance cache in a most robust way. For now I am starting with something a bit ad-hoc. We can experiment with this, and see if this works.

Note I only migrate few most problematic cases of the old callback-based pattern (one of those actually used an invalid callback). I also rename the global state file added in #21170 to have more generic name.

This also removes one function-level import and few nested functions, which may make code faster with mypyc (I measure 0.5% improvement, but this is at the noise level).

cc @JukkaL

@github-actions

This comment has been minimized.

Copy link
Copy Markdown
Collaborator

@JukkaL JukkaL left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that now that modules are available via global state, the callbacks are pointless and just make the code harder to understand (and error-prone, as you mentioned).



fixer_state: Final = FixerState()
modules_state: Final = FixerState()
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style nit: Rename also FixerState -> ModulesState or similar.

# We keep the unused `named_type` argument to avoid breaking plugins.
def type_object_type(
info: TypeInfo, named_type: Callable[[str], Instance] | None = None
) -> ProperType:
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe document the unused named_type parameter in the docstring, as it may look confusing.

@github-actions
Copy link
Copy Markdown
Contributor

According to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅

@ilevkivskyi ilevkivskyi merged commit ea8efbd into python:master Apr 13, 2026
24 checks passed
@ilevkivskyi ilevkivskyi deleted the less-named-type branch April 13, 2026 16:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants