Closed treykeown closed 10 months ago
import msgspec
from typing import Generic, TypeVar
T = TypeVar('T')
T_int = TypeVar('T_int', bound=int)
class Base(msgspec.Struct, Generic[T], tag=True):
"""..."""
class Subclass(Base[int]):
"""..."""
class Bug(Subclass, Base[T_int], Generic[T_int]):
"""..."""
if __name__ == "__main__":
enc = msgspec.msgpack.encode(Bug())
dec = msgspec.msgpack.decode(enc, type=list[Bug])
print(dec)
Traceback (most recent call last):
File "/Users/.../scratch.py", line 21, in <module>
dec = msgspec.msgpack.decode(enc, type=list[Bug])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/.../.venv/lib/python3.12/site-packages/msgspec/_utils.py", line 113, in get_class_annotations
mro, typevar_mappings = _get_class_mro_and_typevar_mappings(obj)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/.../.venv/lib/python3.12/site-packages/msgspec/_utils.py", line 90, in _get_class_mro_and_typevar_mappings
inner(obj, {})
File "/Users/.../.venv/lib/python3.12/site-packages/msgspec/_utils.py", line 88, in inner
inner(b, new_scope)
File "/Users/.../.venv/lib/python3.12/site-packages/msgspec/_utils.py", line 88, in inner
inner(b, new_scope)
^^^^^^^^^
UnboundLocalError: cannot access local variable 'new_scope' where it is not associated with a value
I've since fixed how my classes are structured, but this is still an issue any time a generic class appears both in a parent class and in a child class.
Thanks for the excellent reproducible issue, this should be fixed by #626.
Description
The issue here https://github.com/jcrist/msgspec/blob/4d4a02e62ee7b9ccc5dadaa2b0d1336279561bb4/msgspec/_utils.py#L88 If the
else
on line 75 is taken, but neither of the two innerif
statements are true,new_scope
is unset.Traceback from msgspec:
I'll work on creating a minimal example.