Descriptors don't work with `TypeGuard`
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 42/100
Rechercherichtung
Beginne mit der verlinkten mypy-play-Reproduktion und vergleiche das TypeGuard-Verhalten in problem() mit dem funktionierenden direkten get-Aufruf in contrast(). Verfolge den auf Deskriptoren basierenden Narrowing-Pfad und überprüfe, dass instance im Wahrheitswert-true-Zweig auf DerivedClass eingegrenzt wird, während der false-Zweig BaseClass bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Bug Report
The tool doesn't correctly interpret TypeGuard in the context of a descriptor.
To Reproduce
mypy-play.net gist
from __future__ import annotations
from typing import *
from typing_extensions import (
TypeGuard,
)
class SomeDescriptor:
# simplified: no @overload for obj=None, klass=<type ...>
def __get__(
self, obj: object, klass: Optional[Type[object]] = None
) -> TypeGuard[DerivedClass]:
return isinstance(obj, DerivedClass)
class BaseClass:
described = SomeDescriptor()
class DerivedClass(BaseClass): pass
def problem(instance: BaseClass) -> None:
if instance.described:
reveal_type(instance) # BaseClass (expected: DerivedClass)
else:
reveal_type(instance) # BaseClass (correct)
def contrast(descr: SomeDescriptor, instance: BaseClass) -> None:
if descr.__get__(instance):
reveal_type(instance) # DerivedClass (correct)
else:
reveal_type(instance) # BaseClass (correct)
Expected Behavior
In problem(), the type of instance should be narrowed when instance.described is truthy.
Actual Behavior
While mypy understands that a TypeGuard returns a bool, it doesn't narrow the type when the TypeGuard returns True.
Your Environment
- Mypy version used: 1.8.0
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files): none - Python version used: 3.8, 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
-
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
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100