Opened 2 days ago

Closed 8 hours ago

#36208 closed Uncategorized (invalid)

Python 3.12/3.13 Enum-related error but only triggered via PyCharm debug start

Reported by: Tim Richardson Owned by:
Component: Uncategorized Version: 5.1
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

This is with Django 5.1.6

When using python 3.12 or 3.13, starting runserver via pycharm's debugger is triggering this code path and error.

I don't know if this is Django problem, but the stack trace is deep in Django code. The debugger triggers a code path which is somehow unusual.
This problem first occurred about a week ago. I can not reproduce this problem is a simple Django project. On the other hand, I also can not find via git bisect when this problem was introduced by a change in my code. It looks like a confluence of circumstances.

Reverting to python 3.11 avoids the problem.

Although finding what I may have done to cause this has eluded me, there is actually a real error trace:


Connected to pydev debugger (build 243.24978.54)
django_api_sync_web  | Traceback (most recent call last):
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 394, in execute
django_api_sync_web  |     autoreload.check_errors(django.setup)()
django_api_sync_web  |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/utils/autoreload.py", line 64, in wrapper
django_api_sync_web  |     fn(*args, **kwargs)
django_api_sync_web  |     ~~^^^^^^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/__init__.py", line 16, in setup
django_api_sync_web  |     from django.urls import set_script_prefix
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/urls/__init__.py", line 1, in <module>
django_api_sync_web  |     from .base import (
django_api_sync_web  |     ...<11 lines>...
django_api_sync_web  |     )
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/urls/base.py", line 8, in <module>
django_api_sync_web  |     from .exceptions import NoReverseMatch, Resolver404
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/urls/exceptions.py", line 1, in <module>
django_api_sync_web  |     from django.http import Http404
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/http/__init__.py", line 9, in <module>
django_api_sync_web  |     from django.http.response import (
django_api_sync_web  |     ...<16 lines>...
django_api_sync_web  |     )
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/http/response.py", line 19, in <module>
django_api_sync_web  |     from django.core.serializers.json import DjangoJSONEncoder
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/serializers/__init__.py", line 23, in <module>
django_api_sync_web  |     from django.core.serializers.base import SerializerDoesNotExist
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/serializers/base.py", line 8, in <module>
django_api_sync_web  |     from django.db import models
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/__init__.py", line 3, in <module>
django_api_sync_web  |     from django.db.models.aggregates import *  # NOQA
django_api_sync_web  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/aggregates.py", line 6, in <module>
django_api_sync_web  |     from django.db.models.expressions import Case, Func, Star, Value, When
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/expressions.py", line 853, in <module>
django_api_sync_web  |     class TemporalSubtraction(CombinedExpression):
django_api_sync_web  |     ...<11 lines>...
django_api_sync_web  |             )
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/expressions.py", line 854, in TemporalSubtraction
django_api_sync_web  |     output_field = fields.DurationField()
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 228, in __init__
django_api_sync_web  |     self.choices = choices
django_api_sync_web  |     ^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 551, in choices
django_api_sync_web  |     self._choices = normalize_choices(value)
django_api_sync_web  |                     ~~~~~~~~~~~~~~~~~^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/utils/choices.py", line 74, in normalize_choices
django_api_sync_web  |     from django.db.models.enums import ChoicesType
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/enums.py", line 101, in <module>
django_api_sync_web  |     class IntegerChoices(Choices, IntEnum):
django_api_sync_web  |     ...<2 lines>...
django_api_sync_web  |         pass
django_api_sync_web  |   File "/usr/local/lib/python3.13/enum.py", line 487, in __prepare__
django_api_sync_web  |     metacls._check_for_existing_members_(cls, bases)
django_api_sync_web  |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/enum.py", line 937, in _check_for_existing_members_
django_api_sync_web  |     raise TypeError(
django_api_sync_web  |     ...<2 lines>...
django_api_sync_web  |             )
django_api_sync_web  | TypeError: <enum 'IntegerChoices'> cannot extend <enum 'Choices'>
django_api_sync_web  | 
django_api_sync_web  | During handling of the above exception, another exception occurred:
django_api_sync_web  | 
django_api_sync_web  | Traceback (most recent call last):
django_api_sync_web  |   File "/opt/.pycharm_helpers/pydev/pydevd.py", line 1570, in _exec
django_api_sync_web  |     pydev_imports.execfile(file, globals, locals)  # execute the script
django_api_sync_web  |     ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
django_api_sync_web  |   File "/opt/.pycharm_helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
django_api_sync_web  |     exec(compile(contents+"\n", file, 'exec'), glob, loc)
django_api_sync_web  |     ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
django_api_sync_web  |   File "manage.py", line 22, in <module>
django_api_sync_web  |     main()
django_api_sync_web  |     ~~~~^^
django_api_sync_web  |   File "manage.py", line 18, in main
django_api_sync_web  |     execute_from_command_line(sys.argv)
django_api_sync_web  |     ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
django_api_sync_web  |     utility.execute()
django_api_sync_web  |     ~~~~~~~~~~~~~~~^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 407, in execute
django_api_sync_web  |     _parser = self.fetch_command("runserver").create_parser(
django_api_sync_web  |               ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 275, in fetch_command
django_api_sync_web  |     klass = load_command_class(app_name, subcommand)
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 48, in load_command_class
django_api_sync_web  |     module = import_module("%s.management.commands.%s" % (app_name, name))
django_api_sync_web  |   File "/usr/local/lib/python3.13/importlib/__init__.py", line 88, in import_module
django_api_sync_web  |     return _bootstrap._gcd_import(name[level:], package, level)
django_api_sync_web  |            ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
django_api_sync_web  |   File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
django_api_sync_web  |   File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
django_api_sync_web  |   File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
django_api_sync_web  |   File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
django_api_sync_web  |   File "<frozen importlib._bootstrap_external>", line 1026, in exec_module
django_api_sync_web  |   File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/management/commands/runserver.py", line 10, in <module>
django_api_sync_web  |     from django.core.servers.basehttp import WSGIServer, get_internal_wsgi_application, run
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/servers/basehttp.py", line 18, in <module>
django_api_sync_web  |     from django.core.handlers.wsgi import LimitedStream
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/handlers/wsgi.py", line 5, in <module>
django_api_sync_web  |     from django.core.handlers import base
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/handlers/base.py", line 11, in <module>
django_api_sync_web  |     from django.urls import get_resolver, set_urlconf
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/urls/__init__.py", line 1, in <module>
django_api_sync_web  |     from .base import (
django_api_sync_web  |     ...<11 lines>...
django_api_sync_web  |     )
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/urls/base.py", line 8, in <module>
django_api_sync_web  |     from .exceptions import NoReverseMatch, Resolver404
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/urls/exceptions.py", line 1, in <module>
django_api_sync_web  |     from django.http import Http404
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/http/__init__.py", line 9, in <module>
django_api_sync_web  |     from django.http.response import (
django_api_sync_web  |     ...<16 lines>...
django_api_sync_web  |     )
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/http/response.py", line 19, in <module>
django_api_sync_web  |     from django.core.serializers.json import DjangoJSONEncoder
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/serializers/__init__.py", line 23, in <module>
django_api_sync_web  |     from django.core.serializers.base import SerializerDoesNotExist
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/core/serializers/base.py", line 8, in <module>
django_api_sync_web  |     from django.db import models
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/__init__.py", line 3, in <module>
django_api_sync_web  |     from django.db.models.aggregates import *  # NOQA
django_api_sync_web  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/aggregates.py", line 6, in <module>
django_api_sync_web  |     from django.db.models.expressions import Case, Func, Star, Value, When
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/expressions.py", line 853, in <module>
django_api_sync_web  |     class TemporalSubtraction(CombinedExpression):
django_api_sync_web  |     ...<11 lines>...
django_api_sync_web  |             )
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/expressions.py", line 854, in TemporalSubtraction
django_api_sync_web  |     output_field = fields.DurationField()
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 228, in __init__
django_api_sync_web  |     self.choices = choices
django_api_sync_web  |     ^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py", line 551, in choices
django_api_sync_web  |     self._choices = normalize_choices(value)
django_api_sync_web  |                     ~~~~~~~~~~~~~~~~~^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/utils/choices.py", line 74, in normalize_choices
django_api_sync_web  |     from django.db.models.enums import ChoicesType
django_api_sync_web  |   File "/usr/local/lib/python3.13/site-packages/django/db/models/enums.py", line 101, in <module>
django_api_sync_web  |     class IntegerChoices(Choices, IntEnum):
django_api_sync_web  |     ...<2 lines>...
django_api_sync_web  |         pass
django_api_sync_web  |   File "/usr/local/lib/python3.13/enum.py", line 487, in __prepare__
django_api_sync_web  |     metacls._check_for_existing_members_(cls, bases)
django_api_sync_web  |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
django_api_sync_web  |   File "/usr/local/lib/python3.13/enum.py", line 937, in _check_for_existing_members_
django_api_sync_web  |     raise TypeError(
django_api_sync_web  |     ...<2 lines>...
django_api_sync_web  |             )
django_api_sync_web  | TypeError: <enum 'IntegerChoices'> cannot extend <enum 'Choices'>
Aborting on container exit...
 Container django_api_sync_web  Stopping
 Container django_api_sync_web  Stopped
exit status 1

Change History (2)

comment:1 by Tim Richardson, 8 hours ago

This seems like a problem with the Pycharm debugger. It looks like the Enum TypeError exception is copiously encountered in Django at the moment, and the exception is trapped and essentially ignored (I think). But certain break point locations and the debugger's runtime behaviour are somehow stopping the exception handling. I can proceed with debugging by clearing all breakpoints, I don't yet know which ones cause the problem.

However, not a Django bug.

comment:2 by Tim Richardson, 8 hours ago

Resolution: invalid
Status: newclosed
Note: See TracTickets for help on using tickets.
Back to Top