python / python/mypy

Assertion failure crash with shadowed functools module: assert isinstance(singledispatch_obj, Instance)

Open
#20,339 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

crash priority-2-low
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

Crash Report

I noticed this crash when running mypy on the cpython codebase.

Traceback

Traceback (most recent call last):
  File ".venv-mypy/bin/mypy", line 7, in <module>
    sys.exit(console_entry())
  File "mypy/mypy/__main__.py", line 15, in console_entry
    main()
  File "mypy/mypy/main.py", line 127, in main
    res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
  File "mypy/mypy/main.py", line 211, in run_build
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "mypy/mypy/build.py", line 223, in build
    result = _build(
  File "mypy/mypy/build.py", line 302, in _build
    graph = dispatch(sources, manager, stdout)
  File "mypy/mypy/build.py", line 2953, in dispatch
    process_graph(graph, manager)
  File "mypy/mypy/build.py", line 3344, in process_graph
    done, still_working = manager.wait_for_done(graph)
  File "mypy/mypy/build.py", line 926, in wait_for_done
    process_stale_scc(graph, next_scc, self)
  File "mypy/mypy/build.py", line 3482, in process_stale_scc
    graph[id].type_check_first_pass()
  File "mypy/mypy/build.py", line 2341, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "mypy/mypy/checker.py", line 530, in check_first_pass
    self.accept(d)
  File "mypy/mypy/checker.py", line 641, in accept
    stmt.accept(self)
    ~~~~~~~~~~~^^^^^^
  File "mypy/mypy/nodes.py", line 1164, in accept
    return visitor.visit_decorator(self)
           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "mypy/mypy/checker.py", line 5466, in visit_decorator
    self.visit_decorator_inner(e)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
  File "mypy/mypy/checker.py", line 5502, in visit_decorator_inner
    sig, t2 = self.expr_checker.check_call(
              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        dec, [temp], [nodes.ARG_POS], e, callable_name=fullname, object_type=object_type
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "mypy/mypy/checkexpr.py", line 1589, in check_call
    return self.check_callable_call(
           ~~~~~~~~~~~~~~~~~~~~~~~~^
        callee,
        ^^^^^^^
    ...<6 lines>...
        object_type,
        ^^^^^^^^^^^^
    )
    ^
  File "mypy/mypy/checkexpr.py", line 1832, in check_callable_call
    new_ret_type = self.apply_function_plugin(
        callee,
    ...<7 lines>...
        context,
    )
  File "mypy/mypy/checkexpr.py", line 1270, in apply_function_plugin
    return callback(
        FunctionContext(
    ...<8 lines>...
        )
    )
  File "mypy/mypy/plugins/singledispatch.py", line 109, in create_singledispatch_function_callback
    assert isinstance(singledispatch_obj, Instance)
           ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 
functools.py:4: : note: use --pdb to drop into pdb

To Reproduce

Save the following snippet as functools.py and run mypy on it:

def singledispatch(func):
    pass

@singledispatch
def f(fn):
    pass

Your Environment

  • Mypy version used: 67df1163e5e2d197795811d8083da6afd13fb4f3
  • Mypy command-line flags: N/A
  • Mypy configuration options from mypy.ini (and other config files): N/A
  • Python version used: 3.13.7
  • Operating system and version: Arch Linux

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with mypy/plugins/singledispatch.py, especially create_singledispatch_function_callback and the assertion shown in the traceback. Reproduce the crash by saving the provided snippet as functools.py and running mypy on it. Done means this shadowed functools module no longer causes an AssertionError.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
devtools
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.