python / python/mypy

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

Ouverte
#21,048 2 commentaires 1 réaction 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug topic-reachability topic-type-form topic-type-narrowing
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

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?

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Le rapport ne mentionne aucun fichier source ni aucun test existant. Commencez par exécuter le reproducteur fourni avec --enable-incomplete-feature=TypeForm et --warn-unreachable, puis suivez la gestion des recouvrements de TypeForm pour typing.NewType, types.GenericAlias et types.UnionType. C’est terminé lorsque ces branches sont considérées comme atteignables et qu’un test de régression couvre les cas.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
devtools
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
48/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.