`mypy` does not infer correctly with a `__class__` override

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

还没有人认领这个 Issue。

评估

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

调研方向

运行 issue 中链接的 mypy-play 重现,并将 reveal_type(foo([1])) 的结果与预期的 int 进行比较。跟踪当其 Protocol 定义了 __class__ 属性时,重载解析如何处理 ReducedCovariantList。当示例推断出 int,且回归测试覆盖 override 情况时,即视为完成。

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

描述

bug

Bug Report

mypy does not infer correctly with a __class__ override.

To Reproduce

https://mypy-play.net/?gist=9e3ffebda54d02c5e68f45fe7cd33eb0

from typing import Any, Protocol, overload, reveal_type
from collections.abc import Iterator, Sequence
from typing_extensions import TypeVar

_T_co = TypeVar("_T_co", covariant=True)

class ReducedCovariantList(Protocol[_T_co]):
    @property
    def __class__(self) -> type[list[Any]]: ...
    def __iter__(self) -> Iterator[_T_co]: ...

@overload
def foo(x: ReducedCovariantList[str]) -> str: ...
@overload
def foo(x: Sequence[int]) -> int: ...

# ty gives Unknown; mypy gives str; pyright and pyrefly give int
reveal_type(foo([1]))
# if we remove the __class__ override, both ty and mypy give int

Expected Behaviour

reveal_type gives int

Actual Behavior

reveal_type gives str

Your Environment

  • Mypy version used: 2.3.0
  • Mypy command-line flags: -
  • Mypy configuration options from mypy.ini (and other config files): -
  • Python version used: 3.12
主要语言
Python
星标
20.6k
派生
3.3k
平均合并
1 天 9 小时
30 天内合并 PR
56

贡献指南

打开贡献指南

从这里开始

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

python/mypy 的其他 Issue

查看 python/mypy 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

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