code: def track_object(self, instance, name=None, resolution_level=0, keep=False, trace=False):
          
  
          # Check if object is already tracked. This happens if track_object is
          # called multiple times for the same object or if an object inherits
          # from multiple tracked classes. In the latter case, the most
          # specialized class wins.  To detect id recycling, the weak reference
          # is checked. If it is 'None' a tracked object is dead and another one
          # takes the same 'id'.
          if id(instance) in self.objects and \
              self.objects[id(instance)].ref() is not None:
              return
  
          tobj = TrackedObject(instance, resolution_level=resolution_level, trace=trace)
  
          if name is None:
              name = instance.__class__.__name__
          if not name in self.index:
              self.index[name] = []
          self.index[name].append(tobj)
          self.objects[id(instance)] = tobj
  
          if keep:
              self._keepalive.append(instance)
docs: Track object 'instance' and sample size and lifetime information.
          Not all objects can be tracked; trackable objects are class instances and
          other objects that can be weakly referenced. When an object cannot be
          tracked, a `TypeError` is raised.
  
          :param resolution_level: The recursion depth up to which referents are
              sized individually. Resolution level 0 (default) treats the object
              as an opaque entity, 1 sizes all direct referents individually, 2
              also sizes the referents of the referents and so forth.
          :param keep: Prevent the object's deletion by keeping a (strong)
              reference to the object.