-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Closed
Labels
Description
Crash Report
If you run stubtest on a stub with a method like this, stubtest will crash:
from typing import final, overload
class C:
@overload
@final
def foo(self, obj: str) -> int: ...
@overload
def foo(self, obj: int) -> str: ...
The crash occurs regardless of the order in which you stack the @final
and @overload
decorator on the first overload. (PEP 591 specifies that for overloaded definitions in stubs, the @final
decorator should be placed on the first overload, but doesn't specify which order they should be stacked in.)
Traceback
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 1823, in <module>
sys.exit(main())
^^^^^^
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 1819, in main
return test_stubs(parse_options(sys.argv[1:]))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 1692, in test_stubs
for error in test_module(module):
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 218, in test_module
yield from verify(stub, runtime, [module_name])
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 396, in verify_mypyfile
yield from verify(stub_entry, runtime_entry, object_path + [entry])
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 517, in verify_typeinfo
yield from verify(stub_to_verify, runtime_attr, object_path + [entry])
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 1050, in verify_overloadedfuncdef
stub_sig = Signature.from_overloadedfuncdef(stub)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\alexw\AppData\Local\Temp\tmp_p_nrkoa\Lib\site-packages\mypy\stubtest.py", line 756, in from_overloadedfuncdef
assert func is not None
^^^^^^^^^^^^^^^^
AssertionError
To Reproduce
Two ways to reproduce:
(1) Apply this diff, and then run pytest mypy/test/teststubtest.py
:
diff --git a/mypy/test/teststubtest.py b/mypy/test/teststubtest.py
index d39812b5f..b7f114b5e 100644
--- a/mypy/test/teststubtest.py
+++ b/mypy/test/teststubtest.py
@@ -1177,6 +1177,24 @@ class StubtestUnit(unittest.TestCase):
""",
error="C",
)
+ yield Case(
+ stub="""
+ from typing import overload
+ from typing_extensions import final
+ class D:
+ @overload
+ @final
+ def foo(self, obj: int) -> str: ...
+ @overload
+ def foo(self, obj: str) -> int: ...
+ """,
+ runtime="""
+ class D:
+ def foo(self, obj):
+ return 42 if isinstance(obj, str) else "foo"
+ """,
+ error=None
+ )
(2) With a typeshed clone checked out, apply this diff, then run python tests/stubtest_stdlib.py
:
diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi
index 2c21cd95d..8cdcd3b6a 100644
--- a/stdlib/builtins.pyi
+++ b/stdlib/builtins.pyi
@@ -189,6 +189,7 @@ class type:
class super:
@overload
+ @final
def __init__(self, __t: Any, __obj: Any) -> None: ...
@overload
def __init__(self, __t: Any) -> None: ...
Your Environment
Reproduced with mypy 1.1.1 and mypy @ bfa9eac