python / python/typing_extensions
`IntFloatTuple` from PEP 646 doesn't work as expected on Python<3.11
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 583
- Forks
- 146
- Merge moyen
- 10 h 11 min
- PR mergées (30 j)
- 5
Description
I was working on serialization / deserialization logic for the new PEP 646 in mashumaro, but unfortunately the following example from https://peps.python.org/pep-0646/#type-arguments-can-be-variadic doesn't work as expected on older python versions with typing-extensions 4.4.0:
from typing import Tuple, TypeVar
from typing_extensions import TypeVarTuple, Unpack, get_args
K = TypeVar("K")
T = TypeVar("T")
Ts = TypeVarTuple("Ts")
Ts1 = TypeVarTuple("Ts1")
Ts2 = TypeVarTuple("Ts2")
IntTuple = Tuple[int, Unpack[Ts1]]
IntFloatTuple = IntTuple[float, Unpack[Ts2]]
print(IntFloatTuple.__args__)
print(get_args(IntFloatTuple))
The PEP said:
Here, *Ts1 in the IntTuple alias is bound to Tuple[float, *Ts2], resulting in an alias IntFloatTuple equivalent to Tuple[int, float, *Ts2].
On python 3.11.0 it works seamlessly as expected:
print(IntFloatTuple.__args__)
# (<class 'int'>, <class 'float'>, *Ts2)
On python 3.10.9 it produces error on IntFloatTuple = IntTuple[float, Unpack[Ts2]]:
Traceback (most recent call last):
File "/Users/alexander.tikhonov/projects/mashumaro/pep_646.py", line 12, in <module>
IntFloatTuple = IntTuple[float, Unpack[Ts2]]
File "/Users/alexander.tikhonov/.pyenv/versions/3.10.9/lib/python3.10/typing.py", line 309, in inner
return cached(*args, **kwds)
File "/Users/alexander.tikhonov/.pyenv/versions/3.10.9/lib/python3.10/typing.py", line 1070, in __getitem__
arg = subst[arg]
KeyError: typing_extensions.Unpack[Ts1]
On python 3.9.16 it produces the same error on IntFloatTuple = IntTuple[float, Unpack[Ts2]]:
Traceback (most recent call last):
File "/Users/alexander.tikhonov/projects/mashumaro/pep_646.py", line 12, in <module>
IntFloatTuple = IntTuple[float, Unpack[Ts2]]
File "/Users/alexander.tikhonov/.pyenv/versions/3.9.16/lib/python3.9/typing.py", line 274, in inner
return cached(*args, **kwds)
File "/Users/alexander.tikhonov/.pyenv/versions/3.9.16/lib/python3.9/typing.py", line 774, in __getitem__
arg = subst[arg]
KeyError: typing_extensions.Unpack[Ts1]
On python 3.8.16 it produces wrong result:
print(IntFloatTuple.__args__)
(<class 'int'>, typing_extensions.Unpack[Ts1])
print(get_args(IntFloatTuple))
# (<class 'int'>, typing_extensions.Unpack[Ts1])
On python 3.7.16 it produces the same wrong result:
print(IntFloatTuple.__args__)
# (<class 'int'>, typing_extensions.Unpack[Ts1])
print(get_args(IntFloatTuple))
# (<class 'int'>, typing_extensions.Unpack[Ts1])
I couldn't figure out how to get type arguments the same on all python versions, and so it stops me from full support for variadic generics. At the moment I have to skip some tests like this one on python<3.11.
P.S. This problem also affects IntFloatsTuple = IntTuple[Unpack[Tuple[float, ...]]].
Guide de contribution
Ouvrir 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.
Piste de recherche
Commencez par l’exemple de PEP 646 dans l’issue et comparez son comportement entre les versions de Python signalées avec typing-extensions 4.4.0. Examinez ensuite les cas ignorés dans tests/test_pep_646.py autour des lignes 392-408 ; le travail est terminé lorsque les alias variadiques imbriqués produisent des arguments de type cohérents sur les anciennes versions prises en charge.
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
- 35/100