python / python/mypy

constrained TypeVar does not allow default of one of the constraint choices

Open
#18,017 2 comments 6 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug topic-type-variables
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

I suspect this is related to https://github.com/python/mypy/issues/3737 but seems to be a specific sub-case that should be unambigious (and pyright accepts the code unchanged)

Bug Report

a constrained TypeVar T: (U, V) "T must be either U or V" does not accept either U or V as a default value

To Reproduce

https://mypy-play.net/?mypy=latest&python=3.12&gist=b7cc5486d300e5869277d59fa33a2b03

class U: pass
class V: pass

class C[T: (U, V)]:
    def __init__(self, tp: type[T] = U) -> None:
        self.x: dict[int, T] = {1: tp()}

(I kinda understand that mypy wouldn't know well enough that C() would actually be C[U] -- I've omitted overloads that make that work with mypy -- but the error on the default parameter still remains)

Expected Behavior

(no errors)

Actual Behavior

main.py:5: error: Incompatible default for argument "tp" (default has type "type[U]", argument has type "type[V]")  [assignment]
Found 1 error in 1 file (checked 1 source file)

I'm guessing that for a constrained typevar mypy is just checking each possible constraint against the default value?

Your Environment

  • Mypy version used: 1.12.1
  • Mypy command-line flags: n/a
  • Mypy configuration options from mypy.ini (and other config files): n/a
  • Python version used: 3.12.x

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

Reproduce the constrained TypeVar example from the linked mypy-play page with mypy 1.12.1, then trace the type-checking path for the default argument. Add a regression test covering defaults of both constraint choices, and verify that the example reports no errors.

Written by the indexing model from the issue text.

Assessment

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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.