(🐞) Call to function decorated with a `Callable` causes inner function to fail to infer type of variable
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
from typing import Any, Callable, TypeVar, _T as T
def bar() -> None:
def inner() -> None:
it.encode() # error: Cannot determine type of 'it'
breaks()
it = ""
deco: Callable[[T], T]
@deco
def breaks() -> None: ...
It appears that the order of the function declarations affects the result(:trollface:):
from typing import Any, Callable, TypeVar
T = TypeVar("T")
deco: Callable[[T], T]
@deco
def doesnt_break() -> None: ...
def bar() -> None:
def inner() -> None:
it.encode() # no error
doesnt_break()
it = ""
I have determined that this only happens when the deco is a Callable, when it is a function there is no error:
from typing import Any, TypeVar, _T as T
def bar() -> None:
def inner() -> None:
it.encode() # no error
doesnt_break()
it = ""
def deco(fn: T) -> T: ...
@deco
def doesnt_break() -> None: ...
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
Beginne damit, die beiden Python-Reproduktionen aus dem Issue auszuführen oder das verlinkte Playground zu verwenden, und vergleiche die Callable-basierte Dekoration mit dem funktionsbasierten Decorator. Verfolge den Typinferenzpfad für die verschachtelte innere Funktion und den Decorator-Aufruf; die Aufgabe ist abgeschlossen, wenn das erste Beispiel als str inferiert wird, ohne die Beispiele zu regressieren, die bereits bestehen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 42/100