seandstewart / typical

Typical: Fast, simple, & correct data-validation using Python 3 typing.
https://python-typical.org
MIT License
183 stars 9 forks source link

tojson and primitive fails when class is derived #185

Closed kfollesdal closed 2 years ago

kfollesdal commented 2 years ago

Description

Try to make one class inherit another class. When using tojson or primitive on derived class get RecursionError.

What I Did

import typic

@typic.klass
class A:
    a :int

@typic.klass
class B(A):
    b:int

b = B(1,2)

try:
    b.tojson()
except RecursionError as e:
    print(e)
    b.primitive()

Traceback:

/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/klass.py:236: UserWarning: Keyword `always` will default to `False` in a future version. You should update your code to either explicitly declare `always=True` or update your code to not assume values will be coerced when set.
  return make_typedclass(
maximum recursion depth exceeded while calling a Python object
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    b.tojson()
  File "/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/ext/json.py", line 34, in tojson
    return __dumps(__prim(o), **kwargs)
  File "<typical generated serializer__5288976827520983837>", line 7, in serializer__5288976827520983837
  File "/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/serde/resolver.py", line 670, in iterator
    return __fields(o)
  File "/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/serde/resolver.py", line 670, in iterator
    return __fields(o)
  File "/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/serde/resolver.py", line 670, in iterator
    return __fields(o)
  [Previous line repeated 496 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    b.primitive()
  File "<typical generated serializer__5288976827520983837>", line 7, in serializer__5288976827520983837
  File "/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/serde/resolver.py", line 670, in iterator
    return __fields(o)
  File "/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/serde/resolver.py", line 670, in iterator
    return __fields(o)
  File "/nix/store/6v5r9jyh7c96gh3j4bg8niakhk34dbrk-python3.8-typical-2.7.4/lib/python3.8/site-packages/typic/serde/resolver.py", line 670, in iterator
    return __fields(o)
  [Previous line repeated 496 more times]
RecursionError: maximum recursion depth exceeded