Skip to content

Improve error message for dotted names resolved through variables or functions#21449

Open
kimjune01 wants to merge 1 commit intopython:masterfrom
kimjune01:fix-8603-base-class-error
Open

Improve error message for dotted names resolved through variables or functions#21449
kimjune01 wants to merge 1 commit intopython:masterfrom
kimjune01:fix-8603-base-class-error

Conversation

@kimjune01
Copy link
Copy Markdown

Fixes #8603

When a dotted name like b.a is used in a type context and b resolves to a variable (or function), mypy currently reports Name "b.a" is not defined, which is misleading — the user may think they have a typo.

This PR detects when the lookup passes through a Var, FuncDef, or Decorator node and appends a clarifying parenthetical:

Name "b.a" is not defined ("b" is a variable, not a module or class)

This makes it clear that the problem is structural (attribute access on a non-module/class) rather than a missing name.

… function

When a dotted name like `b.a` is used as a type (e.g. base class or
annotation) and the prefix resolves to a variable or function instead of
a module or class, mypy previously emitted the confusing error:

    Name "b.a" is not defined

The new message explains *why* the name can't be resolved:

    Name "b.a" is not defined ("b" is a variable, not a module or class)

For functions the parenthetical says "a function" instead of "a variable".

Fixes python#8603
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 9, 2026

Diff from mypy_primer, showing the effect of this PR on open source code:

steam.py (https://github.com/Gobot1234/steam.py)
- steam/ext/commands/cog.py:184: error: Name "commands.Context" is not defined  [name-defined]
+ steam/ext/commands/cog.py:184: error: Name "commands.Context" is not defined ("commands" is a variable, not a module or class)  [name-defined]
- steam/ext/commands/cog.py:198: error: Name "commands.Context" is not defined  [name-defined]
+ steam/ext/commands/cog.py:198: error: Name "commands.Context" is not defined ("commands" is a variable, not a module or class)  [name-defined]
- steam/ext/commands/cog.py:208: error: Name "commands.Context" is not defined  [name-defined]
+ steam/ext/commands/cog.py:208: error: Name "commands.Context" is not defined ("commands" is a variable, not a module or class)  [name-defined]

operator (https://github.com/canonical/operator)
- ops/_private/harness.py:426: error: Name "self._charm_cls.on.__class__" is not defined  [name-defined]
+ ops/_private/harness.py:426: error: Name "self._charm_cls.on.__class__" is not defined ("self" is a variable, not a module or class)  [name-defined]
- ops/_private/harness.py:431: error: Name "self._charm_cls" is not defined  [name-defined]
+ ops/_private/harness.py:431: error: Name "self._charm_cls" is not defined ("self" is a variable, not a module or class)  [name-defined]
- ops/_private/harness.py:2144: error: Name "model.CloudSpec" is not defined  [name-defined]
+ ops/_private/harness.py:2144: error: Name "model.CloudSpec" is not defined ("model" is a function, not a module or class)  [name-defined]

artigraph (https://github.com/artigraph/artigraph)
- src/arti/internal/mappings.py:253: error: Name "cls.__target_type__" is not defined  [name-defined]
+ src/arti/internal/mappings.py:253: error: Name "cls.__target_type__" is not defined ("cls" is a variable, not a module or class)  [name-defined]

ibis (https://github.com/ibis-project/ibis)
- ibis/backends/tests/base.py:197: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/base.py:197: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/base.py:212: error: Name "pd.DataFrame" is not defined  [name-defined]
+ ibis/backends/tests/base.py:212: error: Name "pd.DataFrame" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/base.py:228: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/base.py:228: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/base.py:232: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/base.py:232: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/base.py:240: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/base.py:240: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/base.py:245: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/base.py:245: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_window.py:50: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_window.py:50: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_window.py:79: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_window.py:79: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_window.py:83: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_window.py:83: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:53: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:53: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:62: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:62: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:81: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:81: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:102: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:102: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:108: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:108: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:108: error: Name "pd.DataFrame" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:108: error: Name "pd.DataFrame" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:162: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:162: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:162: error: Name "pd.DataFrame" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:162: error: Name "pd.DataFrame" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:172: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:172: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:172: error: Name "pd.DataFrame" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:172: error: Name "pd.DataFrame" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:183: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:183: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:183: error: Name "pd.DataFrame" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:183: error: Name "pd.DataFrame" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:190: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:190: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:190: error: Name "pd.DataFrame" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:190: error: Name "pd.DataFrame" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:229: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:229: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:259: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:259: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_vectorized_udf.py:265: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_vectorized_udf.py:265: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_aggregation.py:46: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_aggregation.py:46: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_aggregation.py:1565: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_aggregation.py:1565: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_aggregation.py:1569: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_aggregation.py:1569: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_aggregation.py:1569: error: Name "np.ndarray" is not defined  [name-defined]
+ ibis/backends/tests/test_aggregation.py:1569: error: Name "np.ndarray" is not defined ("np" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_aggregation.py:1679: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_aggregation.py:1679: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_aggregation.py:1683: error: Name "pd.Series" is not defined  [name-defined]
+ ibis/backends/tests/test_aggregation.py:1683: error: Name "pd.Series" is not defined ("pd" is a variable, not a module or class)  [name-defined]
- ibis/backends/tests/test_aggregation.py:1683: error: Name "np.ndarray" is not defined  [name-defined]
+ ibis/backends/tests/test_aggregation.py:1683: error: Name "np.ndarray" is not defined ("np" is a variable, not a module or class)  [name-defined]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bad error message: mypy reports 'Name is not defined' when using an object member as super class of another class

1 participant