python / python/mypy

`TypeIs` with `isinstance` fails to narrow

Ouverte
#21,508 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

Bug Report

If I use TypeIs along with isinstance, the type doesn't get narrowed

To Reproduce

from typing import TypeIs, Any, TypeAlias, reveal_type

SliceInt: TypeAlias = slice[int | None, int | None, int | None]
SliceStr: TypeAlias = slice[str | None, str | None, str | None]


def is_slice_int(obj: Any) -> TypeIs[SliceInt]:  # type: ignore[empty-body]
    ...



def main(obj: SliceInt | SliceStr) -> None:
    if is_slice_int(obj):
        pass
    elif isinstance(obj, slice):
        reveal_type(obj)

https://mypy-play.net/?mypy=latest&python=3.14&gist=170b0c83ef93742ff998485be01e9440

Expected Behavior

t.py:19: note: Revealed type is "slice[str | None, str | None, str | None]"

Actual Behavior

t.py:19: note: Revealed type is "slice[int | None, int | None, int | None] | slice[str | None, str | None, str | None]"

Note that, for comparison, pyright and pyrefly get this right:

(scratch) mgorelli@marcoslaptop:~/scratch$ pyright t.py
pyre/home/mgorelli/scratch/t.py
  /home/mgorelli/scratch/t.py:19:21 - information: Type of "obj" is "slice[str | None, str | None, str | None]"
0 errors, 0 warnings, 1 information
(scratch) mgorelli@marcoslaptop:~/scratch$ pyright t.py
/home/mgorelli/scratch/t.py
  /home/mgorelli/scratch/t.py:19:21 - information: Type of "obj" is "slice[str | None, str | None, str | None]"
0 errors, 0 warnings, 1 information
(scratch) mgorelli@marcoslaptop:~/scratch$ pyrefly check t.py
 INFO revealed type: slice[str | None, str | None, str | None] [reveal-type]
  --> t.py:19:20
   |
19 |         reveal_type(obj)
   |                    -----
   |
 INFO 0 errors

Your Environment

  • Mypy version used: 2.1.0
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files):
  • Python version used: 3.13.13

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

Commencez par le reproducteur mypy-play lié et comparez le type révélé pour la branche TypeIs/isinstance avec la sortie attendue. Suivez les points d’entrée du rétrécissement de type pour TypeIs et isinstance, puis vérifiez que l’exemple ne révèle que SliceStr et ajoutez une couverture pour cette régression si l’emplacement de test pertinent est trouvé.

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é
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
52/100

Recevez les nouvelles issues par e-mail

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