Skip to content

Commit 7d98cef

Browse files
fix: serialize typing classes assigned to fields
1 parent a6ef70f commit 7d98cef

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

langfuse/serializer.py

+8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import enum
77
from json import JSONEncoder
88
from typing import Any
9+
import typing
910
from uuid import UUID
1011
from collections.abc import Sequence
1112
from langfuse.api.core import serialize_datetime
@@ -107,6 +108,13 @@ def default(self, obj: Any):
107108
if isinstance(obj, Sequence):
108109
return [self.default(item) for item in obj]
109110

111+
# typing.get_origin only available in Python 3.8 and above
112+
try:
113+
if isinstance(obj, type) or typing.get_origin(obj) is not None:
114+
return f"<{getattr(obj, 'name', str(obj))}>"
115+
except Exception:
116+
pass
117+
110118
if hasattr(obj, "__slots__"):
111119
return self.default(
112120
{slot: getattr(obj, slot, None) for slot in obj.__slots__}

tests/test_serializer.py

+12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime, date, timezone
2+
import typing
23
from uuid import UUID
34
from enum import Enum
45
from dataclasses import dataclass
@@ -182,6 +183,17 @@ def __init__(self):
182183
assert json.loads(serializer.encode(obj)) == {"field": "value"}
183184

184185

186+
def test_slots_types():
187+
class SlotClass:
188+
def __init__(self):
189+
self.something = typing.Sequence[int]
190+
191+
obj = SlotClass()
192+
193+
serializer = EventSerializer()
194+
assert json.loads(serializer.encode(obj)) == {"something": "<typing.Sequence[int]>"}
195+
196+
185197
def test_numpy_float32():
186198
import numpy as np
187199

0 commit comments

Comments
 (0)