python / python/mypy

`tuple[*Ts]` subtype with extra type parameter not gradually assignable to itself

Ouverte
#19,908 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

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

Description

This demonstrates the issue:

from typing import Any

class Array[DataT, *ShapeTs](tuple[*ShapeTs]): ...

type Float2D = Array[float, *tuple[int, int]]  # or Array[float, int, int]
type FloatND = Array[float, *tuple[Any, ...]]

def from_2d(a: Float2D) -> FloatND:
    return a  # mypy: ✅, pyright: ✅

def into_2d(a: FloatND) -> Float2D:
    return a  # mypy: ❌, pyright: ✅

https://mypy-play.net/?mypy=latest&python=3.13&flags=strict&gist=1b95c702df6de35fa3f61aa7b5dfef16

Without the additional DataT typar, the false positive disappears

from typing import Any

class Array[*ShapeTs](tuple[*ShapeTs]): ...

type Float2D = Array[*tuple[int, int]]  # or Array[int, int]
type FloatND = Array[*tuple[Any, ...]]

def from_2d(a: Float2D) -> FloatND:
    return a  # mypy: ✅, pyright: ✅

def into_2d(a: FloatND) -> Float2D:
    return a  # mypy: ✅, pyright: ✅

https://mypy-play.net/?mypy=latest&python=3.13&flags=strict&gist=be0dfedeb0e7ed14da359cd52d2901e7

The issue also disappears when tuple is no longer a base class

from typing import Any

class Array[float, *ShapeTs]: ...

type Float2D = Array[float, *tuple[int, int]]  # or Array[float, int, int]
type FloatND = Array[float, *tuple[Any, ...]]

def from_2d(a: Float2D) -> FloatND:
    return a  # mypy: ✅, pyright: ✅

def into_2d(a: FloatND) -> Float2D:
    return a  # mypy: ✅, pyright: ✅

https://mypy-play.net/?mypy=latest&python=3.13&flags=strict&gist=a1439e7c3037239bc4663b981534fb17

Potentially related issues:

  • #18665
  • #19106
  • #19109
  • #19110
  • #19860
  • #19858

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 exécuter les deux reproductions Python dans les exemples mypy-play liés avec mypy 3.13 strict settings, en comparant les affectations from_2d et into_2d ainsi que les variantes sans DataT ou sans la classe de base tuple. Examinez les issues associées #18665, #19106, #19109, #19110, #19860 et #19858 ; le travail est considéré comme terminé lorsque l’affectation problématique est traitée de manière cohérente sans casser les cas qui fonctionnent déjà.

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é
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

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