Non-optional send types and the Generator.send() parameter
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Merge moyen
- 1 j 18 h
- PR mergées (30 j)
- 54
Description
Bug Report
Python doesn’t allow you to send a non-None value to a just-started generator, but if the send type of a generator is not annotated Optional then .send(None) can’t be used.
You could just use next() at the start, but a situation can be created where Python and Mypy don’t agree on a type error. Pyright behaves similarly.
I’m not sure what the solution is here. This issue might require discussion.
To Reproduce
$ cat file1.py
from collections.abc import Generator
def g() -> Generator[int, int, None]:
sent = 0
while True:
sent = yield sent
gen = g()
print(gen.send(0)) # <--
print(gen.send(1))
print(gen.send(2))
$ mypy --strict file1.py
Success: no issues found in 1 source file
$ python3 file1.py
Traceback (most recent call last):
File "/Users/danpro/Desktop/fold/file1.py", line 10, in <module>
print(gen.send(0)) # <--
TypeError: can't send non-None value to a just-started generator
$
$
$ cat file2.py
from collections.abc import Generator
def g() -> Generator[int, int, None]:
sent = 0
while True:
sent = yield sent
gen = g()
print(gen.send(None)) # <--
print(gen.send(1))
print(gen.send(2))
$ mypy --strict file2.py
file2.py:10: error: Argument 1 to "send" of "Generator" has incompatible type "None"; expected "int"
Found 1 error in 1 file (checked 1 source file)
$ python3 file2.py
0
1
2
Expected Behavior
A TypeError should not occur at runtime when Mypy reports successful type checking.
Actual Behavior
A TypeError occurs even though Mypy reports successful type checking.
My Environment
- Mypy version used: 0.910
- Python version used: 3.9.6
- Pyright version used: 1.1.163
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 le comportement de typage de Generator.send() décrit dans les deux reproductions file1.py et file2.py, en comparant les résultats de mypy avec le TypeError à l'exécution de Python. Examinez la manière dont le type send de Generator gère la valeur None initiale et prenez en compte l'interaction avec le comportement comparable de Pyright. Le travail est considéré comme terminé lorsque le vérificateur de types n'accepte plus de code qui peut échouer immédiatement à l'exécution, le comportement attendu étant établi pour les deux exemples.
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é
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 25/100