python / python/mypy

Stubtest crashes if an `@overload` is decorated

Open
#20,064 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

crash topic-stubtest
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

Crash Report

I tried running stubtest on the numpy codebase using the compiled mypy 1.18.2 version + the patch from #20063. This triggered an assertion failure in hypothesis.extra.numpy.arrays (huh?). The relevant code contains code like

@overload
@defines_strategy(force_reusable_values=True)
def arrays(
   # --snip--

which I believe is what is triggering this asserion to fail. See HypothesisWorks/hypothesis#4564 for the relevant code.

Traceback

Traceback (most recent call last):
  File "/home/joren/Workspace/numpy/.venv/bin/stubtest", line 10, in <module>
    sys.exit(main())
             ~~~~^^
  File "/home/joren/Workspace/numpy/.venv/lib/python3.14/site-packages/mypy/stubtest.py", line 2448, in main
    return test_stubs(parse_options(sys.argv[1:]))
  File "/home/joren/Workspace/numpy/.venv/lib/python3.14/site-packages/mypy/stubtest.py", line 2296, in test_stubs
    for error in test_module(module):
                 ~~~~~~~~~~~^^^^^^^^
  File "/home/joren/Workspace/numpy/.venv/lib/python3.14/site-packages/mypy/stubtest.py", line 257, in test_module
    yield from verify(stub, runtime, [module_name])
  File "/home/joren/Workspace/numpy/.venv/lib/python3.14/site-packages/mypy/stubtest.py", line 436, in verify_mypyfile
    yield from verify(stub_entry, runtime_entry, object_path + [entry])
  File "/home/joren/Workspace/numpy/.venv/lib/python3.14/site-packages/mypy/stubtest.py", line 1347, in verify_overloadedfuncdef
    stub_sig = Signature.from_overloadedfuncdef(stub)
  File "/home/joren/Workspace/numpy/.venv/lib/python3.14/site-packages/mypy/stubtest.py", line 971, in from_overloadedfuncdef
    assert func is not None, f"Failed to resolve decorated overload of {stub.fullname!r}"
           ^^^^^^^^^^^^^^^^
AssertionError: Failed to resolve decorated overload of 'hypothesis.extra.numpy.arrays'

To Reproduce

  • clone https://github.com/numpy/numpy
  • uv venv .venv
  • source .venv/bin/activate
  • uv pip install -r requirements/build_requirements.txt -r requirements/test_requirements.txt
  • spin build
  • create mypy.ini:
    [mypy]
    ignore_errors = True
    
  • create allowlist.txt:
    numpy\._typing.*
    numpy\.typing\.mypy_plugin
    numpy\.conftest.*
    numpy\.random\._generator\.__test__
    numpy(\.\w+)?\.tests.*
    numpy\._core\.cversions
    numpy\.f2py\.__main__
    numpy\.distutils.*
    numpy\.f2py\._backends\._distutils
    numpy\._build_utils.*
    numpy\._pyinstaller.*
    
  • stubtest --mypy-config-file=mypy.ini --allowlist=allowlist.txt --concise --tb numpy

Your Environment

  • Mypy version used: 1.18.2 (compiled: yes)
  • Mypy command-line flags: see above
  • Mypy configuration options from mypy.ini (and other config files): see above
  • Python version used: 3.14.0
  • Operating system and version: Ubuntu 22.04

BTW, adding hypothesis.* to the allowlist doesn't seem to help.

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 in mypy/stubtest.py at Signature.from_overloadedfuncdef and verify_overloadedfuncdef, using the traceback to trace how decorated @overload functions are resolved. Reproduce with the supplied NumPy setup and stubtest command; done means this decorated overload no longer triggers the assertion failure.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
testing-qa, tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.