Property annotated as `FunctionType` triggers false unreachable error on `isinstance` check
还没有人认领这个 Issue。
评估
调研方向
从 issue 中的复现用例开始,跟踪 mypy 对 isinstance 断言的可达性分析,重点关注其对 FunctionType 和 MethodType 的处理。为使用 property 注解的情况添加回归测试,并验证 warn_unreachable 不会产生任何错误或警告。
由索引模型根据 Issue 内容生成。
描述
Bug Report
Mypy incorrectly reports an unreachable error when assert isinstance(..., FunctionType) on a @property annotated as returning FunctionType, even though the constructor enforces the invariant.
This is a false positive: no MethodType is involved, and the assertion is trivially true.
Also, the option that enables this error is warn_unreachable. Is this supposed to be a warning instead of an error?
As an aside, while asserting that a defined function (
def func(): ...) is an instance ofFunctionTypeisTrue, if a parameter of a function/method definesfunc: FunctionType, mypy will raise aarg-typeerror at the call site (error: Argument 1 to "FuncWrap" has incompatible type "Callable[[], int]"; expected "FunctionType" [arg-type]). This also seems like a false positive, as raw function definitions are implicitly of typeFunctionType. Not what this bug is about, but something I ran into designing my wrapper.
To Reproduce
from types import FunctionType
class FuncWrap:
def __init__(self, func: object) -> None:
if not isinstance(func, FunctionType):
raise TypeError()
self._func = func
@property
def __func__(self) -> FunctionType:
return self._func
def good() -> int:
return 1
wrapped = FuncWrap(good)
assert isinstance(wrapped.__func__, FunctionType)
If you replace the assert with
assert wrapped.__func__ is good, mypy reports a newcomparison-overlaperror:error: Non-overlapping identity check (left operand type: "MethodType", right operand type: "FunctionType") [comparison-overlap].
Expected Behavior
No errors/warnings.
Actual Behavior
main.py:18: error: Subclass of "MethodType" and "FunctionType" cannot exist: "MethodType" is final [unreachable]
main.py:18: error: Subclass of "MethodType" and "FunctionType" cannot exist: "FunctionType" is final [unreachable]
Found 2 errors in 1 file (checked 1 source file)
Your Environment
- Mypy version used: 2.3.1, 1.20.x, 1.10.x
- Mypy command-line flags: N/A
- Mypy configuration options from
mypy.ini(and other config files):[tool.mypy] cache_dir = "$MYPY_CONFIG_FILE_DIR/.mypy_cache" check_untyped_defs = true color_output = true disallow_any_generics = true disallow_incomplete_defs = true disallow_untyped_decorators = true disallow_untyped_defs = true exclude = [] explicit_package_bases = false files = [ "src/", "tests/" ] implicit_optional = false implicit_reexport = false incremental = true local_partial_types = true mypy_path = "$MYPY_CONFIG_FILE_DIR/src" namespace_packages = false native_parser = true num_workers = 2 plugins = [] python_version = "3.11" show_error_codes = true show_error_context = true strict = true strict_equality = true strict_optional = true warn_no_return = true warn_redundant_casts = true warn_return_any = true warn_unreachable = true warn_unused_configs = true warn_unused_ignores = true - Python version used: 3.[11-14]
- 主要语言
- 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
-
难度 2/5 1-3 小时 新手友好度 75/100
anthropics/skills#1811 · 1 条评论 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
speaches-ai/speaches#678 ·
-
bug
难度 2/5 1-3 小时 新手友好度 75/100
datalayer/mcp-compose#42 ·
-
难度 2/5 1-3 小时 新手友好度 75/100
conda-forge/spacy-feedstock#177 ·
-
难度 2/5 1-3 小时 新手友好度 70/100
UKGovernmentBEIS/inspect_evals#2523 ·