class_docstr: Base class for FigureWidget. The FigureWidget class is code-generated as a
  subclass
class_docstr_tok: ["Base","class","for","FigureWidget",".","The","FigureWidget","class","is","code-generated","as","a","subclass"]
docstr: Remove properties in input_data that are also in delta_data, and do so
  recursively.
  
  Exception: Never remove 'uid' from input_data, this property is used
  to align traces
  
  Parameters
  ----------
  input_data : dict|list
  delta_data : dict|list
  
  Returns
  -------
  list[tuple[str|int]]
      List of removed property path tuples
docstr_tok: ["Remove","properties","in","input_data","that","are","also","in","delta_data",",","and","do","so","recursively",".","Exception",":","Never","remove","'uid","'","from","input_data",",","this","property","is","used","to","align","traces","Parameters","--","--","--","--","--","input_data",":","dict|list","delta_data",":","dict|list","Returns","--","--","--","-","list","[","tuple","[","str|int","]","]","List","of","removed","property","path","tuples"]
code: def _remove_overlapping_props(input_data, delta_data, prop_path=()):
      """
      Remove properties in input_data that are also in delta_data, and do so
      recursively.
  
      Exception: Never remove 'uid' from input_data, this property is used
      to align traces
  
      Parameters
      ----------
      input_data : dict|list
      delta_data : dict|list
  
      Returns
      -------
      list[tuple[str|int]]
          List of removed property path tuples
      """
  
      # Initialize removed
      # ------------------
      # This is the list of path tuples to the properties that were
      # removed from input_data
      removed = []
  
      # Handle dict
      # -----------
      if isinstance(input_data, dict):
          assert isinstance(delta_data, dict)
  
          for p, delta_val in delta_data.items():
              if isinstance(
                  delta_val, dict
              ) or BaseFigure._is_dict_list(delta_val):
                  if p in input_data:
                      # ### Recurse ###
                      input_val = input_data[p]
                      recur_prop_path = prop_path + (p,)
                      recur_removed = (
                          BaseFigureWidget._remove_overlapping_props(
                              input_val, delta_val, recur_prop_path
                          )
                      )
                      removed.extend(recur_removed)
  
                      # Check whether the last property in input_val
                      # has been removed. If so, remove it entirely
                      if not input_val:
                          input_data.pop(p)
                          removed.append(recur_prop_path)
  
              elif p in input_data and p != "uid":
                  # ### Remove property ###
                  input_data.pop(p)
                  removed.append(prop_path + (p,))
  
      # Handle list
      # -----------
      elif isinstance(input_data, list):
          assert isinstance(delta_data, list)
  
          for i, delta_val in enumerate(delta_data):
              if i >= len(input_data):
                  break
  
              input_val = input_data[i]
              if (
                  input_val is not None
                  and isinstance(delta_val, dict)
                  or BaseFigure._is_dict_list(delta_val)
              ):
                  # ### Recurse ###
                  recur_prop_path = prop_path + (i,)
                  recur_removed = (
                      BaseFigureWidget._remove_overlapping_props(
                          input_val, delta_val, recur_prop_path
                      )
                  )
  
                  removed.extend(recur_removed)
  
      return removed
  
imports: import uuid
  from importlib import import_module
  import os
  import numbers
  import ipywidgets
  from traitlets import List, Unicode, Dict, observe, Integer
  from .basedatatypes import BaseFigure, BasePlotlyType
  from .callbacks import BoxSelector, LassoSelector, InputDeviceState, Points
  from .serializers import custom_serializers
  from .version import __frontend_version__
label_desc: Use image node_id 20 for calling the BaseFigureWidget obj's underlying member method code with example usage: obj._remove_overlapping_props(input_data, delta_data, prop_path) and returns: removed