Skip to content

Instantly share code, notes, and snippets.

@mihgen
Last active December 17, 2023 17:12
Show Gist options
  • Save mihgen/13e4ab36af60e6fa9c97d7e92fb49633 to your computer and use it in GitHub Desktop.
Save mihgen/13e4ab36af60e6fa9c97d7e92fb49633 to your computer and use it in GitHub Desktop.
Wrap your dict with AccessRecorder to see what keys / values have actually been used.
class AccessRecorder:
def __init__(self, original_dict):
self.original_dict = original_dict
self.accessed_keys = set()
self.accessed_values = {}
self._is_list = isinstance(original_dict, list)
def _log_key_value(self, key, value):
self.accessed_keys.add(key)
self.accessed_values[key] = value
def __getitem__(self, key):
value = self.original_dict[key]
if isinstance(value, dict):
value = AccessRecorder(value)
elif isinstance(value, list):
value = [AccessRecorder(item) for item in value]
self._log_key_value(key, value)
return value
def get(self, key, default=None):
if key in self.original_dict:
return self.__getitem__(key)
else:
return default
def create_snapshot(self):
snapshot = {}
for key in self.accessed_keys:
value = self.accessed_values[key]
if isinstance(value, AccessRecorder):
snapshot[key] = value.create_snapshot()
elif isinstance(value, list):
snapshot[key] = [item.create_snapshot() for item in value]
else:
snapshot[key] = value
if self._is_list:
snapshot = [item for item in snapshot.values()]
return snapshot
# Example usage:
my_dict = {'a': [{'x': 'y', 'nbo': 'sjfk'}, {'sds': 'pff'}], 'b': 2, 'c': 3}
access_recorder = AccessRecorder(my_dict)
# Accessing keys and values
print(access_recorder['a'][0]['x'])
print(access_recorder['c'])
# Creating a snapshot
snapshot = access_recorder.create_snapshot()
print("Snapshot:", snapshot) # Snapshot: {'c': 3, 'a': [{'x': 'y'}, {}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment