python / python/mypy

metaclass and new style generics do not work.

Open
#21,845 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

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

Description

Bug Report
mypy fails with (modern and old) generics and metaclass, the whole application crashes.

To Reproduce
create a class like:

class AbstractModelMeta(ABCMeta, type(models.Model)):
    """
    A Django model and Python abstract class
    https://gist.github.com/gavinwahl/7778717
    """

    pass

class SomeClass[TAttachment: Something](models.Model, metaclass=AbstractModelMeta):
    @abstractmethod
    def send_something(self) -> None:
        """
        Send a notification to the original sender of a classification record that their classification record
        has or has not been processed in AP Automation
        """
        pass

The traceback is:

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: 2.3.0
Traceback (most recent call last):
  File "<frozen runpy>", line 203, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "mypy/semanal.py", line 7732, in accept
  File "mypy/nodes.py", line 1165, in accept
  File "mypy/semanal.py", line 991, in visit_func_def
    self.analyze_func_def(defn)
  File "mypy/semanal.py", line 1036, in analyze_func_def
    self.defer(defn)
  File "mypy/semanal.py", line 7333, in defer
    assert not self.final_iteration, "Must not defer during final iteration"
AssertionError: Must not defer during final iteration

src/isp/invoice/classification/models/base/base_classification_record.py:31: note: use --pdb to drop into pdb

Expected Behavior

I expect mypy to correctly understand this. or at least not choke on this.

Actual Behavior

This reports a failure:

error: INTERNAL ERROR -- Please try using mypy master on GitHub:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build

Your Environment

  • Mypy version used: 2.3
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files): from toml file:

[tool.mypy]
python_version = "3.12"
plugins = ["mypy_django_plugin.main"]
ignore_missing_imports = true
exclude = ["migrations/", "130192/", "000000/", "130344/"]
mypy_path = "src"

[tool.django-stubs]
django_settings_module = "isp.platform.conf.dev"

  • Python version used: 3.14.6

I also tried to tell mypy to ignore this file, but when I add it to the "exclude" everything that refers this breaks. And if I try to ignore it any other way it seems to constantly report this error. Is there a way to tell mypy to ignore a file, and manually say "hey this type should be considered "Any".

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

Reproduce the crash with the shown generic Django model, metaclass, mypy 2.3 configuration, and traceback. Start in mypy/semanal.py around analyze_func_def and defer, then follow the visitor path from mypy/nodes.py. Done means the example no longer raises an internal error and mypy reports a usable result for the class.

Written by the indexing model from the issue text.

Assessment

Tech stack
django, python
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.