code: def read(
      fp,
      as_version=nbformat.NO_CONVERT,
      fmt=None,
      config=None,
      **kwargs,
  ):
      """Read a notebook from a file name or a file object
  
      :param fp: a file name or a file object
      :param as_version: see nbformat.read
      :param fmt: (optional) the jupytext format like `md`, `py:percent`, ...
      :param config: (optional) a Jupytext configuration object
      :param kwargs: (not used) additional parameters for nbformat.read
      :return: the notebook
      """
      if as_version != nbformat.NO_CONVERT and not isinstance(
          as_version, int
      ):
          raise TypeError(
              "Second argument 'as_version' should be either nbformat.NO_CONVERT, or an integer."
          )
  
      if fp == "-":
          text = sys.stdin.read()
          # Update the input format by reference if missing
          if isinstance(fmt, dict) and not fmt:
              fmt.update(long_form_one_format(divine_format(text)))
          return reads(text, fmt)
  
      if not hasattr(fp, "read"):
          # Treat fp as a file name
          fp = str(fp)
          _, ext = os.path.splitext(fp)
          fmt = copy(fmt or {})
          if not isinstance(fmt, dict):
              fmt = long_form_one_format(fmt)
          fmt.update({"extension": ext})
          with open(fp, encoding="utf-8") as stream:
              return read(
                  stream,
                  as_version=as_version,
                  fmt=fmt,
                  config=config,
                  **kwargs,
              )
  
      if fmt is not None:
          fmt = long_form_one_format(fmt)
          if fmt["extension"] == ".ipynb":
              notebook = nbformat.read(fp, as_version, **kwargs)
              rearrange_jupytext_metadata(notebook.metadata)
              return notebook
  
      return reads(fp.read(), fmt, config=config, **kwargs)
  
imports: import logging
  import os
  import sys
  import warnings
  from copy import copy, deepcopy
  import nbformat
  from nbformat.v4.nbbase import NotebookNode, new_code_cell, new_notebook
  from nbformat.v4.rwbase import NotebookReader, NotebookWriter
  from .cell_metadata import _IGNORE_CELL_METADATA
  from .formats import _VALID_FORMAT_OPTIONS, divine_format, format_name_for_ext, get_format_implementation, guess_format, long_form_one_format, read_format_from_metadata, rearrange_jupytext_metadata, update_jupytext_formats_metadata
  from .header import encoding_and_executable, header_to_metadata_and_cell, insert_jupytext_info_and_filter_metadata, insert_or_test_version_number, metadata_and_cell_to_header
  from .languages import default_language_from_metadata_and_ext, set_main_and_cell_language
  from .metadata_filter import filter_metadata, update_metadata_filters
  from .myst import MYST_FORMAT_NAME, myst_extensions, myst_to_notebook, notebook_to_myst
  from .pandoc import md_to_notebook, notebook_to_md
  from .pep8 import pep8_lines_between_cells
  from .quarto import notebook_to_qmd, qmd_to_notebook
  from .version import __version__
label_desc: Use image node_id 2 for calling a global function with example usage: read(fp, as_version, fmt, config) and returns: reads, reads, read, notebook