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

未关闭
#13,673 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
45/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
tooling

调研方向

从 issue 中的三个复现函数开始,使用 mypy 和 reveal_type 运行它们,以确认当前行为。跟踪现有的 int | None 值与 Any | None 组合时的类型合并和赋值逻辑。完成标准是:在所有给出的示例中,推断出的类型都保持为 int | None,并为这些情况提供回归覆盖。

由索引模型根据 Issue 内容生成。

描述

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
主要语言
Python
星标
20.6k
派生
3.3k
平均合并
1 天 18 小时
30 天内合并 PR
54

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

python/mypy 的其他 Issue

查看 python/mypy 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。