diff --git a/eliot/json.py b/eliot/json.py index e83df9c..8eaa16c 100644 --- a/eliot/json.py +++ b/eliot/json.py @@ -88,7 +88,8 @@ def json_default(o: object) -> object: if isinstance(o, polars.Datetime): return o.isoformat() - raise TypeError("Unsupported type") + # Fall back to repr() get _some_ useful value to log + return repr(o) if platform.python_implementation() == "PyPy": diff --git a/eliot/tests/test_json.py b/eliot/tests/test_json.py index 76cabca..7961dea 100644 --- a/eliot/tests/test_json.py +++ b/eliot/tests/test_json.py @@ -73,8 +73,8 @@ def test_numpy_not_imported(self): This ensures NumPy isn't a hard dependency. """ - with self.assertRaises(TypeError): - dumps([object()], default=json_default) + weird_val = object() + self.assertEqual(dumps([weird_val], default=json_default), dumps([repr(weird_val)])) self.assertEqual(dumps(12, default=json_default), "12") @skipUnless(np, "NumPy is not installed.") @@ -206,3 +206,11 @@ class TestDataClass: obj = TestDataClass(name="test", value=42) serialized = loads(dumps(obj, default=json_default)) self.assertEqual(serialized, {"name": "test", "value": 42}) + + def test_unserializable(self): + """Test that even values without dedicated JSON serialization + support dump without errors.""" + def unserializable(): + pass + + self.assertEqual(dumps(unserializable, default=json_default), dumps(repr(unserializable)))