Skip to content

Commit ddc9c31

Browse files
author
Maciej Katafiasz
committed
Don't error out when logging non-JSON serialisable values
The serialiser now falls back on repr() to ensure some usable value can always be logged, even if no other serialiser exists for the value. Fixes #515
1 parent c311929 commit ddc9c31

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

eliot/json.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ def json_default(o: object) -> object:
8888
if isinstance(o, polars.Datetime):
8989
return o.isoformat()
9090

91-
raise TypeError("Unsupported type")
91+
# Fall back to repr() get _some_ useful value to log
92+
return repr(o)
9293

9394

9495
if platform.python_implementation() == "PyPy":

eliot/tests/test_json.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ def test_numpy_not_imported(self):
7373
7474
This ensures NumPy isn't a hard dependency.
7575
"""
76-
with self.assertRaises(TypeError):
77-
dumps([object()], default=json_default)
76+
weird_val = object()
77+
self.assertEqual(dumps([weird_val], default=json_default), dumps([repr(weird_val)]))
7878
self.assertEqual(dumps(12, default=json_default), "12")
7979

8080
@skipUnless(np, "NumPy is not installed.")
@@ -206,3 +206,11 @@ class TestDataClass:
206206
obj = TestDataClass(name="test", value=42)
207207
serialized = loads(dumps(obj, default=json_default))
208208
self.assertEqual(serialized, {"name": "test", "value": 42})
209+
210+
def test_unserializable(self):
211+
"""Test that even values without dedicated JSON serialization
212+
support dump without errors."""
213+
def unserializable():
214+
pass
215+
216+
self.assertEqual(dumps(unserializable, default=json_default), dumps(repr(unserializable)))

0 commit comments

Comments
 (0)