Closed
Description
Bug Report
Consider the following: https://mypy-play.net/?mypy=master&python=3.12&gist=dbad46bbd0f39d316a2e82262ceeb4fa
In 1.16, this code raises an error at the first return after the None check, Incompatible return value type (got "None", expected "T")
, though it was fine in 1.15
Your Environment
- Mypy version used: 1.16
- Mypy command-line flags: stock
- Mypy configuration options from
mypy.ini
(and other config files): n/a - Python version used: 3.11, 3.12
Activity
hauntsaninja commentedon May 29, 2025
mypy_primer -p test.py --bisect --debug --old 'v1.15.0'
says this is #18972hauntsaninja commentedon May 29, 2025
Simpler repro:
[-]'Incompatible return value type (... expected "T")' when using param spec and `is None` in wrapped function[/-][+][1.16 regression] narrowing a typevar via comparison to None[/+]ilevkivskyi commentedon May 30, 2025
I will take a look at this (hopefully during weekend). The best course of action may be to infer a type variable with upper bound
None
(or anything else that doesn't make a meaningful intersection with given type variable). Essentially we can do something like (very roughly)meet(T(bound=A), B) == T(bound=meet(A, B))
.Narrow type variable bounds in binder (python#19183)