docs: def parse_expr(expr, local_dict=None):
      """
      Parses a json-object created with 'expr_to_json' into a Sympy expression.
  
      If a local_dict argument is passed, symbols with be looked up by name, and a new symbol will
      be created only if the name is not in local_dict.
      """
      if local_dict is None:
          local_dict = {}
      if expr["type"] == "Add":
          return add([parse_expr(arg, local_dict) for arg in expr["args"]])
      elif expr["type"] == "Mul":
          return mul([parse_expr(arg, local_dict) for arg in expr["args"]])
      elif expr["type"] == "Pow":
          return Pow(parse_expr(arg, local_dict) for arg in expr["args"])
      elif expr["type"] == "Symbol":
          try:
              return local_dict[expr["name"]]
          except KeyError:
              return symbolics.Symbol(expr["name"])
      elif expr["type"] == "Number":
          return symbolics.sympify(expr["value"])
      else:
          raise NotImplementedError(expr["type"] + " is not implemented")