Generic type inferred wrong; curious difference betweer `aiter(f(x))` and `c = f(x); aiter(c)`
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 42/100
Rechercherichtung
Beginne mit dem main.py-Reproducer aus dem Issue, verwende die aufgeführten Python- und mypy-Versionen und vergleiche die Fälle mit aufgeteiltem und verschachteltem aiter(coro_to_aiter(coro)). Verfolge, wie die generische Typinferenz jeden Aufruf behandelt, und füge einen fokussierten Regressionstest für die Abweichung hinzu oder aktualisiere ihn. Erledigt ist die Aufgabe, wenn beide Formen konsistente, erwartete Diagnosen erhalten.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Bug Report
Consider this code (playground):
from typing import TypeVar, Generic, Callable, Coroutine, Any, AsyncIterator
_T = TypeVar("_T")
class StartedToken:
pass
class ProducerContext(Generic[_T]):
pass
async def coro_to_aiter(
coroutine: Callable[[ProducerContext[_T]], Coroutine[Any, Any, None]]
) -> AsyncIterator[_T | StartedToken]:
yield StartedToken()
async def coro(ctx: ProducerContext[int]) -> None:
pass
# Split into two lines, no error:
c = coro_to_aiter(coro) # no error
it = aiter(c) # no error
# The same on one line -> mypy error:
it2 = aiter(coro_to_aiter(coro)) # error: Argument 1 to "coro_to_aiter" has incompatible type ...
Expected Behavior
I would expect mypy to not error on the it2 definition line. Moreover, regardless of whether mypy can handle these definitions, I would expect to see the same behavior (error or absence of error) in the "Split into two lines" case and the "on one line" case.
Actual Behavior
I get this error on the it2 line, and no errors on other lines:
main.py:24: error: Argument 1 to "coro_to_aiter" has incompatible type "Callable[[ProducerContext[int]], Coroutine[Any, Any, None]]"; expected "Callable[[ProducerContext[int | StartedToken]], Coroutine[Any, Any, None]]" [arg-type]
Your Environment
- Mypy version used: 1.6.1 (playground), current master
- Python version used: 3.11, 3.12
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- Ø Merge
- 1 T. 18 Std.
- Gemergte PRs (30 T.)
- 54
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus python/mypy
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
-
documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
-
bug topic-configuration topic-error-reporting
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Ähnliche Issues
-
area/auth bug comp/agent P3 platform/discord type/security
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
NousResearch/hermes-agent#117848 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
bancolombia/sentinel#23 ·
-
test md OffenCI
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100