class_docstr: Visit cell to look for get_ipython calls.
  
  Note that the source of the abstract syntax tree
  will already have been processed by IPython's
  TransformerManager().transform_cell.
  
  For example,
  
      %matplotlib inline
  
  would have been transformed to
  
      get_ipython().run_line_magic('matplotlib', 'inline')
  
  and we look for instances of the latter (and likewise for other
  types of magics).
class_docstr_tok: ["Visit","cell","to","look","for","get_ipython","calls",".","Note","that","the","source","of","the","abstract","syntax","tree","will","already","have","been","processed","by","IPython's","TransformerManager","(",")",".transform_cell",".","For","example",",","%","matplotlib","inline","would","have","been","transformed","to","get_ipython","(",")",".run_line_magic","(","'matplotlib","'",",","'inline","'",")","and","we","look","for","instances","of","the","latter","(","and","likewise","for","other","types","of","magics",")","."]
code: def __init__(self) -> None:
      self.magics: Dict[
          int, List[OffsetAndMagic]
      ] = collections.defaultdict(list)
  
imports: import ast
  import collections
  import dataclasses
  import secrets
  import sys
  from functools import lru_cache
  from importlib.util import find_spec
  from typing import Dict, List, Optional, Tuple
  from black.output import out
  from black.report import NothingChanged
label_desc: Use image node_id 1 to create a new MagicFinder object from inherited base classes: ast with example: obj = MagicFinder()