Descriptors don't work with `TypeGuard`
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 42/100
Direção de pesquisa
Comece com a reprodução vinculada no mypy-play e compare o comportamento de TypeGuard em problem() com a chamada direta funcional a get em contrast(). Rastreie o caminho de narrowing baseado em descritor e verifique se instance é reduzido a DerivedClass no ramo verdadeiro, enquanto o ramo falso permanece BaseClass.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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
- Linguagem predominante
- Python
- Estrelas
- 20.6k
- Forks
- 3.3k
- Merge médio
- 1d 18h
- PRs com merge (30d)
- 54
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de python/mypy
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
-
documentation
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
bug topic-configuration topic-error-reporting
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
Todas as issues de python/mypy
Issues semelhantes
-
area/auth bug comp/agent P3 platform/discord type/security
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
NousResearch/hermes-agent#117848 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
bancolombia/sentinel#23 ·
-
test md AbertaCI
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100