python / python/mypy

Calling `type[T]` returns the parent of `T` on Python 3.12+

Open
#18,088 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

Bug Report / To Reproduce
Ok so this is a weird one, and I've been completely unable to replicate it in an MRE. So here's the PR where this happened to us: https://github.com/pypa/setuptools/pull/4726

To replicate, clone the setuptools repo, install the [core,type] extras, then change the start of setuptools/command/install.py's install.do_egg_install to:

    def do_egg_install(self) -> None:
        easy_install = cast(
            type[easy_install_cls], self.distribution.get_command_class('easy_install')
        )

        cmd = easy_install(
            self.distribution,
            args="x",
            root=self.root,
            record=self.record,
        )
        reveal_type(cmd)

On Python 3.11

setuptools\command\install.py:150: note: Revealed type is "setuptools.command.easy_install.easy_install"
Success: no issues found in 143 source files

On Python 3.12 & 3.13

setuptools\command\install.py:150: note: Revealed type is "setuptools.Command"
setuptools\command\install.py:166: error: Unexpected keyword argument "show_deprecation" for "run" of "Command"  [call-arg]
Found 1 error in 1 file (checked 143 source files)

My first guess is this has something to do with distutils removal in 3.12, but the results I'm getting are still nonsensical and probably reveal a hidden bug in mypy.

Expected Behavior
cmd should be of type setuptools.command.easy_install or alias easy_install_cls

Actual Behavior

cmd is of type setuptools.Command (superclass of setuptools.command.easy_install)

Your Environment

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the report in setuptools/command/install.py using mypy on Python 3.11, 3.12, and 3.13, and compare the revealed type for cmd. Review the linked setuptools pull request and mypy.ini configuration; done means the cast to type[easy_install_cls] reveals the expected easy_install type without the spurious Command error.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
compilers, devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.