Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

Property annotated as `FunctionType` triggers false unreachable error on `isinstance` check

未關閉
#21,879 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

@daleselaji-dev 已經在處理了。

開始於 2026年8月24日。

  • #21885 來自 @daleselaji-dev —— 未關閉

評估

難度
4/5
預估耗時
3-5 天
新手友好度
50/100
Issue 類型
缺陷
描述清晰度
基本清楚
活躍度
活躍
技術堆疊
python
領域
compilers

研究方向

從 issue 中的重現案例開始,追蹤 mypy 對 isinstance 斷言的可達性分析,著重於其對 FunctionType 和 MethodType 的處理。為使用 property 註解的情況新增回歸測試,並驗證 warn_unreachable 不會產生任何錯誤或警告。

由索引模型根據 Issue 內容生成。

描述

bug topic-descriptors topic-reachability

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 of FunctionType is True, if a parameter of a function/method defines func: FunctionType, mypy will raise a arg-type error 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 type FunctionType. 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 new comparison-overlap error: error: Non-overlapping identity check (left operand type: "MethodType", right operand type: "FunctionType") [comparison-overlap].

gist
playground

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.7k
分支
3.3k
平均合併
2 天 2 小時
30 天內合併 PR
108

環境準備

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

python/mypy 的其他 Issue

查看 python/mypy 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。