python / python/mypy

Unclear when Join is picked vs Union in upcast operation.

Ouverte
#19,652 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug topic-join-v-union
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

I noticed some rather erratic behavior when sometimes it picks union and other times the join.

from typing import Iterable

class A: ...
class B: ...
class C: ...

def upcast[T](arg: Iterable[T]) -> Iterable[T]: return arg

def test_builtin(x: tuple[int, str, None]) -> None:
    reveal_type(upcast(x))  # Iterable[str | int | None]

def test_custom(x: tuple[A, B, C]) -> None:
    reveal_type(upcast(x))  # Iterable[object]

def test_mixed1(x: tuple[A, str, None]) -> None:
    reveal_type(upcast(x))  # Iterable[str | A | None]

def test_mixed2(x: tuple[int, str, C]) -> None:
    reveal_type(upcast(x))  # Iterable[object]

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

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

Reproduisez les quatre exemples dans la configuration mypy-play liée, en commençant par les appels d’upcast et leurs résultats de reveal_type. Suivez le chemin d’inférence des types qui choisit une union ou un object join, puis définissez le comportement cohérent attendu et vérifiez-le avec ces exemples.

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

Évaluation

Stack technique
python
Domaine
tooling
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
38/100

Recevez les nouvelles issues par e-mail

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