python / python/mypy

TypeForm does not overlap with classes that represent special forms at runtime.

Open
#21,048 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

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

Description

Bug Report

A value annotated as a TypeForm is not considered to overlap with various clases used to represent special forms at runtime.

I have tested typing.NewType, types.GenericAlias, and types.UnionType. [^1]

Given a variable defined as x: TypeForm[object] when using isinstance(x, typing.NewType) (or any of the above types), the truthy branch that follows is considered unreachable.

This does not happen with isinstance(x, type) though.

To Reproduce

from typing_extensions import TypeForm
import typing
import types

Y = typing.NewType("Y", int)

x1: TypeForm[object] = Y  # no issue, `Y` is a valid type expression

if isinstance(x1, typing.NewType):
    print("new type") # error: Statement is unreachable  [unreachable]
    
x2: TypeForm[object] = list[int]  # no issue, `list[int]` is a valid type expression

if isinstance(x2, types.GenericAlias):
    print("generic alias") # error: Statement is unreachable  [unreachable]
    
x3: TypeForm[object] = int | str  # no issue, `int | str` is a valid type expression

if isinstance(x3, types.UnionType):
    print("generic alias") # error: Statement is unreachable  [unreachable]
    
x4: TypeForm[object] = int  # no issue, `int` is a valid type expression

if isinstance(x4, type):
    print("generic alias") # no issue, code is reachable

https://mypy-play.net/?mypy=master&python=3.14&flags=warn-unreachable&gist=ea667f1dabb249a088448f23252c92c1

Expected Behavior

The code within the branches to be considered reachable.

Actual Behavior

main.py:10: error: Statement is unreachable  [unreachable]
main.py:15: error: Statement is unreachable  [unreachable]
main.py:20: error: Statement is unreachable  [unreachable]
Found 3 errors in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: 1.19.1 and main branch
  • Mypy command-line flags: --enable-incomplete-feature=TypeForm --warn-unreachable
  • Mypy configuration options from mypy.ini (and other config files):
  • Python version used: 1.14

[^1]: I think think is all the publicly documented classes?

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

The report names no source file or existing test. Start by running the supplied reproducer with --enable-incomplete-feature=TypeForm and --warn-unreachable, then trace TypeForm overlap handling for typing.NewType, types.GenericAlias, and types.UnionType. Done means those branches are considered reachable and a regression test covers the cases.

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
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.