class_docstr: Track side effects (list mutation, setattr, etc) that need to be
  applied after an FX graph is run.
class_docstr_tok: ["Track","side","effects","(","list","mutation",",","setattr",",","etc",")","that","need","to","be","applied","after","an","FX","graph","is","run","."]
code: def diff(self, other: "SideEffects") -> Optional[str]:
      if self.id_to_variable != other.id_to_variable:
          sk_itv = self.id_to_variable.keys()
          ok_itv = other.id_to_variable.keys()
          if sk_itv != ok_itv:
              return f"id_to_variable keys: {sk_itv} != {ok_itv}"
          # Feel free to augment this with more fancy diffing logic
          # if needed for debugging
          return "id_to_variable: unknown diff"
      elif self.store_attr_mutations != other.store_attr_mutations:
          sk_sam = self.store_attr_mutations.keys()
          ok_sam = other.store_attr_mutations.keys()
          if sk_sam != ok_sam:
              return f"store_attr_mutations keys: {sk_sam} != {ok_sam}"
          return "store_attr_mutations: unknown diff"
      elif self.save_for_backward != other.save_for_backward:
          return "save_for_backward"
      else:
          return None
  
imports: import inspect
  from typing import Any, Dict, List, Optional, Union
  import torch.nn
  from .None import utils, variables
  from .bytecode_transformation import create_call_function, create_call_method, create_instruction
  from .codegen import PyCodegen
  from .exc import unimplemented
  from .source import LocalSource, Source
  from .utils import nn_module_new, object_new
  from .variables.base import is_side_effect_safe, MutableLocalBase, MutableLocalSource, VariableTracker
label_desc: Use image node_id 3 for calling the SideEffects obj's underlying member method code with example usage: obj.diff(other) and returns: str, str, sk_itv, str, ok_itv, str, str, sk_sam, str, ok_sam, str, None