code: def _compare(a, b):
      """Compare two python objects."""
      global last_keys
      skip_types = [
          "whitener",
          "proj",
          "reginv",
          "noisenorm",
          "nchan",
          "command_line",
          "working_dir",
          "mri_file",
          "mri_id",
          "scanno",
      ]
      try:
          if isinstance(a, dict):
              assert isinstance(b, dict)
              for k, v in a.items():
                  if k not in b and k not in skip_types:
                      raise ValueError(
                          "First one had one second one didn't:\n"
                          "%s not in %s" % (k, b.keys())
                      )
                  if k not in skip_types:
                      last_keys.pop()
                      last_keys = [k] + last_keys
                      _compare(v, b[k])
              for k in b.keys():
                  if k not in a and k not in skip_types:
                      raise ValueError(
                          "Second one had one first one didn't:\n"
                          "%s not in %s" % (k, sorted(a.keys()))
                      )
          elif isinstance(a, list):
              assert len(a) == len(b)
              for i, j in zip(a, b):
                  _compare(i, j)
          elif isinstance(a, sparse.csr_matrix):
              assert_array_almost_equal(a.data, b.data)
              assert_equal(a.indices, b.indices)
              assert_equal(a.indptr, b.indptr)
          elif isinstance(a, np.ndarray):
              assert_array_almost_equal(a, b)
          else:
              assert a == b
      except Exception:
          print(last_keys)
          raise
  
imports: import copy
  import re
  from pathlib import Path
  import numpy
  import pytest
  from numpy.testing import assert_allclose, assert_array_almost_equal, assert_array_equal, assert_array_less, assert_equal
  from scipy import sparse
  import mne
  from mne import Covariance, EvokedArray, SourceEstimate, combine_evoked, compute_raw_covariance, convert_forward_solution, make_ad_hoc_cov, make_forward_solution, make_sphere_model, pick_channels_forward, pick_types, pick_types_forward, read_cov, read_evokeds, read_forward_solution
  from mne.datasets import testing
  from mne.epochs import Epochs, EpochsArray, make_fixed_length_epochs
  from mne.event import read_events
  from mne.forward import apply_forward, is_fixed_orient, restrict_forward_to_stc
  from mne.io import read_info, read_raw_fif
  from mne.label import label_sign_flip, read_label
  from mne.minimum_norm import INVERSE_METHODS, apply_inverse, apply_inverse_cov, apply_inverse_epochs, apply_inverse_raw, apply_inverse_tfr_epochs, compute_rank_inverse, make_inverse_operator, prepare_inverse_operator, read_inverse_operator, write_inverse_operator
  from mne.source_estimate import VolSourceEstimate, read_source_estimate
  from mne.source_space._source_space import _get_src_nn
  from mne.surface import _normal_orth
  from mne.time_frequency import EpochsTFR
  from mne.utils import _record_warnings, catch_logging
label_desc: Use image node_id 3 for calling a global function with example usage: _compare(a, b) without return types