[ENG-1104] patch json.dumps to handle __wrapped__ objects

Unwrap proxied objects if the default serializer doesn't work.
This commit is contained in:
Masen Furer 2024-10-11 17:30:42 -07:00
parent b1d449897a
commit 35b6139648
No known key found for this signature in database
GPG Key ID: B0008AD22B3B3A95

View File

@ -8,6 +8,7 @@ import copy
import dataclasses
import functools
import inspect
import json
import os
import pickle
import sys
@ -3753,6 +3754,40 @@ def serialize_mutable_proxy(mp: MutableProxy):
return mp.__wrapped__
_orig_json_dumps = json.dumps
def _json_dumps_wrapper(*args, **kwargs):
"""Wrap json.dumps to handle MutableProxy objects.
Args:
*args: args for json.dumps.
**kwargs: kwargs for json.dumps.
Returns:
The JSON string.
"""
_orig_default = kwargs.pop("default", None)
def _default(obj):
if _orig_default is not None:
try:
return _orig_default(obj)
except TypeError:
pass
try:
return obj.__wrapped__
except AttributeError:
pass
raise TypeError()
kwargs["default"] = _default
return _orig_json_dumps(*args, **kwargs)
json.dumps = _json_dumps_wrapper
class ImmutableMutableProxy(MutableProxy):
"""A proxy for a mutable object that tracks changes.