Type is lost after merge with `Union[Any, None]`

Aberta
#13,673 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
45/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
python
Domínio
tooling

Direção de pesquisa

Comece com as três funções de reprodução na issue e execute-as com mypy e reveal_type para confirmar o comportamento atual. Rastreie a lógica de combinação de tipos e atribuição para um valor existente do tipo int | None combinado com Any | None. Considera-se concluído quando o tipo inferido permanecer int | None em todos os exemplos mostrados, com cobertura de regressão para esses casos.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug

Bug Report

from typing import Any

def func(d: dict[int, Any]) -> None:
    x: int | None
    x = d.get(1)
    reveal_type(x)  # typing is lost -> Union[Any, None]

d.get get's correctly inferred as Any | None. However, merging the existing type int | None with Any | None results in Any | None. I.e. mypy looses the original type information. That is unexpected.

Comparing it to a type merge with just Any:

def f(a: Any) -> None:
    x: int | None
    x = a
    reveal_type(x)  # int | None

In this case x retains the type information, as expected.

--
Another example which doesn't rely on dict.get

def g(a: Any | None) -> None:
    x: int | None
    x = a
    reveal_type(x)  # typing is lost -> Union[Any, None]

Expected Behavior

Mypy should retain the original type information even after merging it with Any | None.

Your Environment

  • Mypy version used: 0.971
Linguagem predominante
Python
Estrelas
20.6k
Forks
3.3k
Merge médio
1d 18h
PRs com merge (30d)
54

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de python/mypy

Todas as issues de python/mypy

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.