python / python/mypy

Bug report (Regression): bad overload resolution in `--strict` mode

Open
#19,458 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

The following code type-checked with mypy 1.16.1 in --strict mode but does not type-check with mypy 1.17 and the master branch (currently eb07c060c) in --strict mode. Bisecting points to the commit 33d1eedc0.

Note that the problem does not occur if --strict mode is disabled.

To Reproduce

import inspect
import typing
from typing import Any, ClassVar

def is_classvar(cls: type, scope: dict[Any, type]) -> bool:
    ann = inspect.get_annotations(cls, eval_str=True, locals=scope).get("kind")
    if ann is None:
        raise Exception("Should be annotated.")
    return typing.get_origin(ann) is not ClassVar

Actual Behavior

mypy --strict test_any.py
test_any.py:9: error: Non-overlapping identity check (left operand type: "ParamSpec", right operand type: "<typing special form>")  [comparison-overlap]
Found 1 error in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: mypy 1.17 and master (bad), mypy 1.16.1 (good)
  • Mypy command-line flags: --strict
  • Mypy configuration options from mypy.ini (and other config files):
  • Python version used: 3.13

Note that reveal_type(ann) gives Any | None and that annotating ann: Any | None solves the problem.

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 with the reproducer in test_any.py and the behavior introduced by commit 33d1eedc0. Run mypy --strict against the example on the affected and previously working versions; done means the example type-checks under --strict without requiring an explicit ann: Any | None annotation.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
devtools
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.