polymorphic overloads on `list.__add__` and `dict.__or__` lead to divergences in type checkers.
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
Piste de recherche
Commencez par les surcharges de list.add et dict.or, puis examinez les PRs #14282 et #14284 pour la simplification proposée. Reproduisez les exemples de list et dict avec mypy et pyright, et utilisez mypy-primer pour vérifier que les modifications de stub retenues suppriment les erreurs divergentes du wrapper.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
The overloads on list.__add__ lead to divergent behavior between mypy and pyright when doing something as simple as a list concatenation
# Overloading looks unnecessary, but is needed to work around complex mypy problems
@overload
def __add__(self, value: list[_T], /) -> list[_T]: ...
@overload
def __add__(self, value: list[_S], /) -> list[_S | _T]: ...
Code sample in pyright playground, https://mypy-play.net/?mypy=latest&python=3.12&gist=abf6a8834020af17a16bd8cfb44b2f10
from typing import Any, overload
class ListA[T]: # emulates builtins list
@overload
def __add__(self, other: "ListA[T]", /) -> "ListA[T]": return ListA()
@overload
def __add__[S](self, other: "ListA[S]", /) -> "ListA[T | S]": return ListA()
class ListB[T]: # without overloads
def __add__[S](self, other: "ListB[S]", /) -> "ListB[T | S]": return ListB()
# mypy | pyright
reveal_type( list[str]() + list[str]() ) # list[str] | list[str] ✅️
reveal_type( list[str]() + list[int]() ) # list[str | int] | list[str | int] ✅️
reveal_type( list[str]() + list[Any]() ) # list[Any] | list[str] ❌️
reveal_type( ListA[str]() + ListA[str]() ) # ListA[str] | ListA[str] ✅️
reveal_type( ListA[str]() + ListA[int]() ) # ListA[str | int] | ListA[str | int] ✅️
reveal_type( ListA[str]() + ListA[Any]() ) # ListA[Any] | ListA[str] ❌️
reveal_type( ListB[str]() + ListB[str]() ) # ListB[str] | ListB[str] ✅️
reveal_type( ListB[str]() + ListB[int]() ) # ListB[str | int] | ListB[str | int] ✅️
reveal_type( ListB[str]() + ListB[Any]() ) # ListB[str | Any] | ListB[str | Any] ✅️
This ultimately causes some very annoying type errors when checking wrapper functions in pyright.
Code sample in pyright playground
from typing import Mapping, Any
# function with 2 optional arguments
def foo(arg: object, /, *, opt1: str = ..., opt2: int = ...) -> None: ...
# wrapper that forwards args via dict
def foo_wrapper(arg: object, foo_kwargs: Mapping[str, Any]) -> None:
# apply new defaults
foo_kwargs = {"opt1": "new_default"} | dict(foo_kwargs)
foo(arg, **foo_kwargs) # "str" cannot be assigned to parameter "opt2"
PR #14282 and #14284 show mypy-primer results of simplifying the overloads away from list.__add__ and dict.__or__.
- Langage dominant
- Python
- Étoiles
- 5.1k
- Forks
- 2.1k
- Merge moyen
- 2 j 5 h
- PR mergées (30 j)
- 122
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/typeshed
-
`networkx.set_edge_attributes` should support scalar value + namePeut-être pris @Fire162 l’a pris il y a 10 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
Les mainteneurs répondent en général sous 1 jour
-
false alarm on decode callPeut-être pris @jw9829 l’a pris il y a 38 jours. Ouvertehelp wanted stubs: false positive
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
python/typeshed#16441 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Don't run pyright basic checks on projects with strict pyright settings in CIPeut-être pris @Mohith1612 l’a pris il y a 74 jours. Ouverteproject: infrastructure
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
python/typeshed#16005 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
stubs: improvement
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
python/typeshed#15548 · 5 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
stubs: improvement
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
python/typeshed#15529 · 5 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de python/typeshed
Issues similaires
-
bug ready-for-dev
Difficulté 1/5 1-3 heures Accessibilité débutants 92/100
OpenHands/extensions#897 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
tensorflow/datasets#11253 ·
Les mainteneurs répondent en général sous 1 jour
-
fix(core): a config section with all keys commented out crashes startupPeut-être pris @Aryanbhargava18 l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
kubeflow/mcp-server#512 ·
Les mainteneurs répondent en général sous 1 jour
-
Stop trusting the compromised eMudhra CA certificatesPeut-être pris @anth-volk l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
PolicyEngine/uk-triple-lock#54 ·
Les mainteneurs répondent en général sous 1 jour
-
DBFS append mode silently overwrites existing filesPeut-être pris @IlyaKhalafi l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 77/100
fsspec/filesystem_spec#2429 ·
Les mainteneurs répondent en général sous 1 jour