code: def _log_blocked_setitem(self, key, value, fixed_value):
      if type_changed(value, fixed_value):
          self.typechanges[key] = (type(value), type(fixed_value))
  
      if is_different(value, fixed_value):
          self.modified.add(key)
  
      # if both are dicts recursively collect modified and typechanges
      if isinstance(fixed_value, DogmaticDict) and isinstance(
          value, dict
      ):
          for k, val in fixed_value.typechanges.items():
              self.typechanges[join_paths(key, k)] = val
  
          self.modified |= {
              join_paths(key, m) for m in fixed_value.modified
          }
  
imports: import copy
  import sacred.optional
  from sacred.utils import join_paths, SacredError
label_desc: Use image node_id 4 for calling the DogmaticDict obj's underlying member method code with example usage: obj._log_blocked_setitem(key, value, fixed_value) without return types