You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Using a combination of generic class with self-referenced attributes that in turn have a non-generic type alias causes RecursionError. The setup is similar to #90
What I Did
This code:
from __future__ importannotationsfromdataclassesimportdataclassfromtypingimportTypeVar, Generic, Anyfrommashumaro.mixins.jsonimportDataClassJSONMixinT=TypeVar("T")
@dataclassclassFoo(Generic[T], DataClassJSONMixin):
x: Ty: Foo# ok# z: AnyFoo # Uncomment to get RecursionError: maximum recursion depth exceededAnyFoo=Foo[Any]
@dataclassclassBar(Foo):
...
fails with RecursionError: maximum recursion depth exceeded
with this traceback (actually, traceback comes with recursion limit set to 100 to reduce number of repetitions):
Traceback (most recent call last):
File "/Users/misha/Dev/mashumaro_test/m1.py", line 26, in <module>
class Bar(Foo):
File "/Users/misha/.asdf/installs/python/3.11.1/lib/python3.11/typing.py", line 1818, in __init_subclass__
super().__init_subclass__(*args, **kwargs)
File "/Users/misha/Dev/mashumaro/mashumaro/mixins/dict.py", line 24, in __init_subclass__
compile_mixin_unpacker(cls, **builder_params["unpacker"])
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/mixin.py", line 49, in compile_mixin_unpacker
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 208, in unpack_dataclass_dict_mixin_subclass
builder.add_unpack_method()
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 389, in add_unpack_method
self._add_unpack_method_lines(method_name)
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 304, in _add_unpack_method_lines
self._unpack_method_set_value(
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/code/builder.py", line 419, in _unpack_method_set_value
unpacked_value = UnpackerRegistry.get(
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/common.py", line 86, in get
expr = packer(spec)
^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/types/unpack.py", line 186, in unpack_dataclass_dict_mixin_subclass
if is_dataclass_dict_mixin_subclass(spec.origin_type):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/helpers.py", line 436, in is_dataclass_dict_mixin_subclass
if is_dataclass_dict_mixin(cls):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/helpers.py", line 430, in is_dataclass_dict_mixin
return type_name(typ) == DataClassDictMixinPath
^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/helpers.py", line 230, in type_name
elif not is_type_origin and is_generic(typ):
^^^^^^^^^^^^^^^
File "/Users/misha/Dev/mashumaro/mashumaro/core/meta/helpers.py", line 294, in is_generic
and type(typ[str]) is types.GenericAlias # type: ignore
~~~^^^^^
File "/Users/misha/.asdf/installs/python/3.11.1/lib/python3.11/typing.py", line 341, in inner
return cached(*args, **kwds)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/.asdf/installs/python/3.11.1/lib/python3.11/typing.py", line 1791, in __class_getitem__
if not all(_is_typevar_like(p) for p in params):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/misha/.asdf/installs/python/3.11.1/lib/python3.11/typing.py", line 1791, in <genexpr>
if not all(_is_typevar_like(p) for p in params):
^^^^^^^^^^^^^^^^^^^
RecursionError: maximum recursion depth exceeded
The text was updated successfully, but these errors were encountered:
Description
Using a combination of generic class with self-referenced attributes that in turn have a non-generic type alias causes RecursionError. The setup is similar to #90
What I Did
This code:
fails with
RecursionError: maximum recursion depth exceeded
with this traceback (actually, traceback comes with recursion limit set to 100 to reduce number of repetitions):
The text was updated successfully, but these errors were encountered: