`Attribute 'arguments' of 'FuncItem' undefined` in `get_type_analyze_hook` with caching
Open
Nobody has claimed this yet.
crash
topic-plugins
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
Crash Report
Accessing attribute.node.arguments when using the get_type_analyze_hook hook sometimes after populating the cache crashes mypy with an undefiend access error.
Traceback
<class 'mypy.nodes.SymbolTableNode'>
<class 'mypy.nodes.FuncDef'>
<class 'list'>
Success: no issues found in 1 source file
<class 'mypy.nodes.SymbolTableNode'>
<class 'mypy.nodes.FuncDef'>
a.py:2: error: INTERNAL ERROR -- Please try using mypy master on GitHub:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 1.10.0
Traceback (most recent call last):
File "venv/bin/mypy", line 8, in <module>
sys.exit(console_entry())
File "venv/lib/python3.12/site-packages/mypy/__main__.py", line 15, in console_entry
main()
File "venv/lib/python3.12/site-packages/mypy/main.py", line 103, in main
res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
File "venv/lib/python3.12/site-packages/mypy/main.py", line 187, in run_build
res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
File "venv/lib/python3.12/site-packages/mypy/build.py", line 193, in build
result = _build(
File "venv/lib/python3.12/site-packages/mypy/build.py", line 268, in _build
graph = dispatch(sources, manager, stdout)
File "venv/lib/python3.12/site-packages/mypy/build.py", line 2950, in dispatch
process_graph(graph, manager)
File "venv/lib/python3.12/site-packages/mypy/build.py", line 3348, in process_graph
process_stale_scc(graph, scc, manager)
File "venv/lib/python3.12/site-packages/mypy/build.py", line 3443, in process_stale_scc
mypy.semanal_main.semantic_analysis_for_scc(graph, scc, manager.errors)
File "venv/lib/python3.12/site-packages/mypy/semanal_main.py", line 93, in semantic_analysis_for_scc
process_top_levels(graph, scc, patches)
File "venv/lib/python3.12/site-packages/mypy/semanal_main.py", line 220, in process_top_levels
deferred, incomplete, progress = semantic_analyze_target(
File "venv/lib/python3.12/site-packages/mypy/semanal_main.py", line 349, in semantic_analyze_target
analyzer.refresh_partial(
File "venv/lib/python3.12/site-packages/mypy/semanal.py", line 614, in refresh_partial
self.refresh_top_level(node)
File "venv/lib/python3.12/site-packages/mypy/semanal.py", line 625, in refresh_top_level
self.accept(d)
File "venv/lib/python3.12/site-packages/mypy/semanal.py", line 6976, in accept
node.accept(self)
File "venv/lib/python3.12/site-packages/mypy/nodes.py", line 1349, in accept
return visitor.visit_assignment_stmt(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "venv/lib/python3.12/site-packages/mypy/semanal.py", line 3077, in visit_assignment_stmt
self.process_type_annotation(s)
File "venv/lib/python3.12/site-packages/mypy/semanal.py", line 3591, in process_type_annotation
analyzed = self.anal_type(s.type, allow_tuple_literal=allow_tuple_literal)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "venv/lib/python3.12/site-packages/mypy/semanal.py", line 7127, in anal_type
typ = typ.accept(a)
^^^^^^^^^^^^^
File "venv/lib/python3.12/site-packages/mypy/types.py", line 941, in accept
return visitor.visit_unbound_type(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "venv/lib/python3.12/site-packages/mypy/typeanal.py", line 271, in visit_unbound_type
typ = self.visit_unbound_type_nonoptional(t, defining_literal)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "venv/lib/python3.12/site-packages/mypy/typeanal.py", line 324, in visit_unbound_type_nonoptional
return hook(AnalyzeTypeContext(t, t, self))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c.py", line 22, in handler
print(type(attribute.node.arguments))
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: attribute 'arguments' of 'FuncItem' undefined
To Reproduce
Run the shell script below:
#!/usr/bin/env bash
set -Eeuo pipefail
# Create a.py, b.py, c.py and mypy.ini
cat >a.py <<EOF
from b import C, X
x: X[C]
EOF
cat >b.py <<EOF
from typing import TypeVar, Generic
T = TypeVar('T')
class X(Generic[T]):
pass
class C:
def f(self) -> None:
pass
EOF
cat >c.py <<EOF
from typing import Callable
from mypy.nodes import FuncDef
from mypy.plugin import AnalyzeTypeContext, Plugin
from mypy.types import Type
class MypyPlugin(Plugin):
def get_type_analyze_hook(self, fullname: str) -> Callable[[AnalyzeTypeContext], Type] | None:
if fullname != "b.X":
return None
return handler
def handler(ctx: AnalyzeTypeContext) -> Type:
api = ctx.api.api
base_type = api.anal_type(ctx.type.args[0])
for name, attribute in base_type.type.names.items():
if isinstance(attribute.node, FuncDef):
print(type(attribute))
print(type(attribute.node))
print(type(attribute.node.arguments))
return base_type
def plugin(version: str) -> type[MypyPlugin]:
return MypyPlugin
EOF
cat >mypy.ini <<EOF
[mypy]
plugins = c.py
EOF
rm -Rf .mypy_cache/
# Populate the cache
mypy --show-traceback a.py
# Modify the hash of a.py
echo >>a.py
# Trigger the crash
mypy --show-traceback a.py
Your Environment
- Mypy version used: 1.6.1, 1.7.1, 1.10.0, git (f60f458bf0e75e93a7b23a6ae31afd18f3d201e3);
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files):plugins = c.py - Python version used: 3.10, 3.12
- Operating system and version: Mac Sonoma 14.5 (23F79)
$ pip freeze
mypy @ ../mypy
mypy-extensions==0.4.4
tomli==2.0.1
typed-ast==1.4.3
typing_extensions==4.12.0
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the provided shell reproduction with the plugin in c.py and compare the first cached run with the second run after changing a.py. Start with the get_type_analyze_hook path in mypy/typeanal.py and the semantic-analysis and cache-related frames shown in the traceback. Done means the cached rerun no longer raises the internal AttributeError.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 40/100