オブジェクト シリアライザーを作成していますが、クラス パターンが予想されるケースと一致しないという問題があります。
def dump_obj(x):
match(x):
case list():
emit('L')
dump_obj(len(x))
for elem in x:
dump_obj(elem)
case Iterable():
emit('I')
dump_obj((type(x), list(x)))
case tuple():
emit('T')
dump_obj(list(x))
case str():
emit('S')
dump_obj(len(x))
emit(x)
case int():
emit('D')
emit(str(x))
case _:
raise TypeError(f'Unknown obj {x!r}')
タプルでdump_obj()を呼び出すと、タプルの T ケースに一致するのではなく、イテラブルの I ケースで無限再帰が発生します。
リストのサブクラスでdump_obj()を呼び出すと、イテラブルの意図した I ケースではなく、リストの L ケースに一致します。