code: def sanitize(x: Any) -> Any:  # pylint: disable=invalid-name,too-many-return-statements
      
      if isinstance(x, (str, float, int, bool)):
          # x is already serializable
          return x
      elif isinstance(x, torch.Tensor):
          # tensor needs to be converted to a list (and moved to cpu if necessary)
          return x.cpu().tolist()
      elif isinstance(x, numpy.ndarray):
          # array needs to be converted to a list
          return x.tolist()
      elif isinstance(x, numpy.number):  # pylint: disable=no-member
          # NumPy numbers need to be converted to Python numbers
          return x.item()
      elif isinstance(x, dict):
          # Dicts need their values sanitized
          return {key: sanitize(value) for key, value in x.items()}
      elif isinstance(x, (spacy.tokens.Token, allennlp.data.Token)):
          # Tokens get sanitized to just their text.
          return x.text
      elif isinstance(x, (list, tuple)):
          # Lists and Tuples need their values sanitized
          return [sanitize(x_i) for x_i in x]
      elif x is None:
          return "None"
      elif hasattr(x, 'to_json'):
          return x.to_json()
      else:
          raise ValueError(f"Cannot sanitize {x} of type {type(x)}. "
                           "If this is your own custom class, add a `to_json(self)` method "
                           "that returns a JSON-like object.")
docs: Sanitize turns PyTorch and Numpy types into basic Python types so they
      can be serialized into JSON.