Inferred attribute type feeds back as call context, rejecting its own defining assignment
还没有人认领这个 Issue。
评估
调研方向
从 issue 中的复现用例开始,跟踪针对向未声明的 self 属性赋值的延迟异步重新检查。将该路径与通过的局部属性和带注解属性用例进行比较,重点关注推断出的返回上下文如何传递到泛型参数推断。完成标准是复现用例能够在将 K 推断为 str 的情况下通过,并且回归测试覆盖此行为。
由索引模型根据 Issue 内容生成。
描述
Bug Report
Assigning a generic call returning K | None to a previously undeclared
self. attribute spuriously fails [arg-type] on that same assignment. The
attribute's inferred type (str | None) apparently comes back as call context
on a later pass, solving K = str | None; the invariant Mapping key then
rejects dict[str, str].
The same expression passes with no context, an annotated local, an annotated
attribute, or a reassigned local (whose second assignment is likewise checked
against its own inferred str | None) — the optional-stripping special case
seems skipped on the inferred-attribute path alone. A sync version (no
async/await) also passes, pointing at the deferred re-check await
triggers.
To Reproduce
from collections.abc import Mapping
async def select_one[K](options: Mapping[K, str]) -> K | None: ...
class ViaInferredAttr:
async def m(self) -> None:
cases = {"a": "x"}
self._done = await select_one(cases) # error (spurious)
async def via_local() -> None:
cases = {"a": "x"}
done = await select_one(cases) # ok
done = await select_one(cases) # ok (context = inferred str | None)
done2: str | None = await select_one(cases) # ok
class ViaAnnotatedAttr:
_done: str | None
async def m(self) -> None:
cases = {"a": "x"}
self._done = await select_one(cases) # ok
Expected Behavior
All call sites typecheck, with K = str.
Actual Behavior
repro.py:10: error: Argument 1 to "select_one" has incompatible type "dict[str, str]"; expected "Mapping[str | None, str]" [arg-type]
The str | None key shows the return's | None leaked into K.
Your Environment
- mypy 1.20.2 (compiled), no flags
- Python 3.13
Related: #5874 (over-eager outer context with unions), #19304 (assignment target
changes results). New here: the context is self-inferred — no annotation exists
anywhere — and explicit spellings of the same type behave differently.
- 主要语言
- Python
- 星标
- 20.6k
- 派生
- 3.3k
- 平均合并
- 1 天 12 小时
- 30 天内合并 PR
- 58
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
python/mypy 的其他 Issue
-
bug
难度 2/5 1-3 小时 新手友好度 78/100
-
bug
难度 2/5 1-3 小时 新手友好度 76/100
-
documentation
难度 2/5 1-3 小时 新手友好度 72/100
-
bug topic-configuration topic-error-reporting
难度 2/5 1-3 小时 新手友好度 68/100
-
bug topic-attrs
难度 2/5 1-3 小时 新手友好度 62/100
相似的 Issue
-
essnmx good first issue
难度 1/5 1 小时以内 新手友好度 95/100
-
难度 2/5 1-3 小时 新手友好度 65/100
syfoud/Simulated_Scepter#174 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
Giskard-AI/giskard-oss#2840 · 1 条评论 ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success 未关闭area: repo bug perceived difficulty: 2
难度 2/5 1-3 小时 新手友好度 70/100
-
难度 2/5 1-3 小时 新手友好度 75/100
yeti-platform/yeti#1380 ·