Non-optional send types and the Generator.send() parameter
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginnen Sie mit dem in den beiden Reproduktionen file1.py und file2.py beschriebenen Typisierungsverhalten von Generator.send() und vergleichen Sie die Ergebnisse von mypy mit Pythons Laufzeit-TypeError. Überprüfen Sie, wie der send-Typ von Generator den anfänglichen None-Wert behandelt, und berücksichtigen Sie die Interaktion mit dem vergleichbaren Verhalten von Pyright. Als abgeschlossen gilt die Änderung, wenn der Type Checker keinen Code mehr akzeptiert, der sofort zur Laufzeit fehlschlagen kann, und das beabsichtigte Verhalten für beide Beispiele festgelegt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 25/100