Skip to content

Commit e4f1c76

Browse files
committed
Avoid omitting copied objects as circular dependencies
1 parent bbe66be commit e4f1c76

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

logtail/frame.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,23 +60,28 @@ def _parse_custom_events(record, include_extra_attributes):
6060
def _remove_circular_dependencies(obj, memo=None):
6161
if memo is None:
6262
memo = set()
63+
6364
# Skip immutable types, which can't contain circular dependencies
64-
if isinstance(obj, (str, int, float, bool)):
65+
if isinstance(obj, (str, int, float, bool, type(None))):
6566
return obj
66-
if id(obj) in memo:
67+
68+
# For mutable objects, check for circular references
69+
obj_id = id(obj)
70+
if obj_id in memo:
6771
return "<omitted circular reference>"
68-
memo.add(id(obj))
72+
memo.add(obj_id)
73+
6974
if isinstance(obj, dict):
7075
new_dict = {}
7176
for key, value in obj.items():
72-
new_dict[key] = _remove_circular_dependencies(value, memo)
77+
new_dict[key] = _remove_circular_dependencies(value, memo.copy())
7378
return new_dict
7479
elif isinstance(obj, list):
75-
return [_remove_circular_dependencies(item, memo) for item in obj]
80+
return [_remove_circular_dependencies(item, memo.copy()) for item in obj]
7681
elif isinstance(obj, tuple):
77-
return tuple(_remove_circular_dependencies(item, memo) for item in obj)
82+
return tuple(_remove_circular_dependencies(item, memo.copy()) for item in obj)
7883
elif isinstance(obj, set):
79-
return {_remove_circular_dependencies(item, memo) for item in obj}
84+
return {_remove_circular_dependencies(item, memo.copy()) for item in obj}
8085
else:
8186
return obj
8287

0 commit comments

Comments
 (0)